From 6d8a2d0e15671549d983f17f83bcb2d30ab07c99 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Fri, 23 Oct 2026 20:15:25 -0700 Subject: [PATCH 1/9] Make Xcode Cloud project discoverable Co-Authored-By: Claude Code --- .github/workflows/ci.yml | 4 +- .gitignore | 15 +- CONTRIBUTING.md | 3 +- Flowlight.xcodeproj/project.pbxproj | 2688 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcschemes/Flowlight App Store.xcscheme | 89 + .../xcshareddata/xcschemes/Flowlight.xcscheme | 116 + README.md | 3 +- docs/404.html | 2 +- docs/DEVELOPMENT.md | 8 +- docs/about/index.html | 2 +- docs/de/about/index.html | 2 +- docs/de/docs/index.html | 4 +- docs/de/index.html | 6 +- docs/de/privacy/index.html | 2 +- docs/de/threat-model/index.html | 2 +- docs/docs/index.html | 4 +- docs/es/about/index.html | 2 +- docs/es/docs/index.html | 4 +- docs/es/index.html | 6 +- docs/es/privacy/index.html | 2 +- docs/es/threat-model/index.html | 2 +- docs/fr/about/index.html | 2 +- docs/fr/docs/index.html | 4 +- docs/fr/index.html | 6 +- docs/fr/privacy/index.html | 2 +- docs/fr/threat-model/index.html | 2 +- docs/index.html | 6 +- docs/it/about/index.html | 2 +- docs/it/docs/index.html | 4 +- docs/it/index.html | 6 +- docs/it/privacy/index.html | 2 +- docs/it/threat-model/index.html | 2 +- docs/ja/about/index.html | 2 +- docs/ja/docs/index.html | 4 +- docs/ja/index.html | 6 +- docs/ja/privacy/index.html | 2 +- docs/ja/threat-model/index.html | 2 +- docs/ko/about/index.html | 2 +- docs/ko/docs/index.html | 4 +- docs/ko/index.html | 6 +- docs/ko/privacy/index.html | 2 +- docs/ko/threat-model/index.html | 2 +- docs/llms-full.txt | 19 +- docs/llms.txt | 2 +- docs/plugins/index.html | 2 +- docs/privacy/index.html | 2 +- docs/pt-PT/about/index.html | 2 +- docs/pt-PT/docs/index.html | 4 +- docs/pt-PT/index.html | 6 +- docs/pt-PT/privacy/index.html | 2 +- docs/pt-PT/threat-model/index.html | 2 +- docs/releases/index.html | 19 +- docs/sitemap.xml | 2 +- docs/threat-model/index.html | 2 +- docs/zh-Hans/about/index.html | 2 +- docs/zh-Hans/docs/index.html | 4 +- docs/zh-Hans/index.html | 6 +- docs/zh-Hans/privacy/index.html | 2 +- docs/zh-Hans/threat-model/index.html | 2 +- docs/zh-Hant/about/index.html | 2 +- docs/zh-Hant/docs/index.html | 4 +- docs/zh-Hant/index.html | 6 +- docs/zh-Hant/privacy/index.html | 2 +- docs/zh-Hant/threat-model/index.html | 2 +- project.yml | 4 +- scripts/check_xcode_project.sh | 69 + scripts/normalize_xcode_project.py | 61 + site/pages/releases.html | 15 +- 69 files changed, 3188 insertions(+), 100 deletions(-) create mode 100644 Flowlight.xcodeproj/project.pbxproj create mode 100644 Flowlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight App Store.xcscheme create mode 100644 Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight.xcscheme create mode 100755 scripts/check_xcode_project.sh create mode 100755 scripts/normalize_xcode_project.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cf49525e..52638cc3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -175,8 +175,8 @@ jobs: - name: Install XcodeGen run: brew install xcodegen - - name: Generate the project - run: xcodegen generate + - name: Generate the project and reject drift + run: scripts/check_xcode_project.sh # This compiles a different product graph and activation path from the Developer ID build. Ad-hoc signing # deliberately strips protected entitlements; archive signing validates those with the distribution profiles. diff --git a/.gitignore b/.gitignore index 1a290901..d7b8003a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,19 @@ xcuserdata/ *.pkg *.dmg -# Generated by XcodeGen (regenerate with `xcodegen generate`) -Flowlight.xcodeproj/ +# Generated by XcodeGen (regenerate with `xcodegen generate`). The shared project +# and schemes stay committed because Xcode Cloud must discover its selected +# container before any post-clone script can run. Local and Xcode-managed state +# remains ignored. +Flowlight.xcodeproj/* +!Flowlight.xcodeproj/project.pbxproj +!Flowlight.xcodeproj/project.xcworkspace/ +Flowlight.xcodeproj/project.xcworkspace/* +!Flowlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata +!Flowlight.xcodeproj/xcshareddata/ +Flowlight.xcodeproj/xcshareddata/* +!Flowlight.xcodeproj/xcshareddata/xcschemes/ +!Flowlight.xcodeproj/xcshareddata/xcschemes/*.xcscheme # Signing material. Never commit any of this, however briefly it lives here. certs/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e16a8ac1..c7a95552 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,8 @@ Thanks for helping make network activity on macOS understandable. ```sh brew install xcodegen -xcodegen generate +scripts/check_xcode_project.sh --write +scripts/check_xcode_project.sh scripts/build-local.sh open build/Build/Products/Release/Flowlight.app --args -FLDemo YES # synthetic data, safe for screenshots ``` diff --git a/Flowlight.xcodeproj/project.pbxproj b/Flowlight.xcodeproj/project.pbxproj new file mode 100644 index 00000000..8f5d4344 --- /dev/null +++ b/Flowlight.xcodeproj/project.pbxproj @@ -0,0 +1,2688 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 028E3BA5025E1089C1CA7CEB /* CodeSignatureCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168D824382963305ED7E6C04 /* CodeSignatureCheck.swift */; }; + 03861BEFD76EF771618B928F /* TrafficModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */; }; + 042EE0F6F95E5432AB027C65 /* InspectionBudgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07BDE0C2D8005899C1AF21C /* InspectionBudgetView.swift */; }; + 046D743441B8528AD853BF2D /* BluetoothMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B6A48D086EF16CF6E438FF /* BluetoothMonitor.swift */; }; + 0500979C1F127E3E8BAC2C0F /* AgentCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */; }; + 0567566CCFA1B23855C3C0F1 /* ExportDisclosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF2DEA93C3D6844E3345D2D8 /* ExportDisclosure.swift */; }; + 059D1C5ECA497BBF749BFA1F /* RulePackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08C5F9CC0D644DCA03F5F4C5 /* RulePackTests.swift */; }; + 05D3F9927B8A2B6F4D3CC93C /* WindowVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = E45902808344F173033EB0F5 /* WindowVisibility.swift */; }; + 06806F580BC3A25E6C76B4DE /* HTTPDataTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C34C9D0A9B302B4CF4C7125 /* HTTPDataTransport.swift */; }; + 06A92144D13855A43F30221D /* DemoInspection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FFEA980768CD488D58CC0B1 /* DemoInspection.swift */; }; + 06C9D883620A08BF10DBF82A /* SystemExtensions.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81F190466C9691ADAF7BC8DA /* SystemExtensions.framework */; }; + 06D7DABCED6EF2ED5BD1B725 /* DatabaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D6A2870B379B2C1C171C7A3 /* DatabaseTests.swift */; }; + 07B78C868D02BC6FB6FC561C /* AgentLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440DB80190A1847AC834210D /* AgentLauncher.swift */; }; + 094C8F94FD053B615836D494 /* MCPDomains.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D6CCA395BF33CDF9F92B725 /* MCPDomains.swift */; }; + 0998D0711C9591F12AE30085 /* FeatureGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D568056D9E6FACAC42D563 /* FeatureGuide.swift */; }; + 099CCC081C36710CCD4FFBD5 /* BPFProgram.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CA8150CA012929A40558FB /* BPFProgram.swift */; }; + 09A86273E9179E24B619D829 /* InspectMenuItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 406DB466CD32DA8223AE61A6 /* InspectMenuItems.swift */; }; + 09B577964D76B2CCADA2E3EF /* AgentsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082111849A66652DD9F1BE01 /* AgentsModel.swift */; }; + 09F9A2B71C1F7867CB04DDAC /* NetworkScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */; }; + 0ACF3321E6670591EC9B1306 /* ProtocolClassifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */; }; + 0B9096994698EFB06A95D26D /* ToolActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2E7474FB6A7B8B56B98917 /* ToolActivity.swift */; }; + 0BB12E96D54D92C8D24619B5 /* GlobMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */; }; + 0BC685F72E943E55AA0DFC1A /* RulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88962BAF6E215B83FE0AFF9A /* RulesView.swift */; }; + 0C0204670BD00994D9821D5F /* FocusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61080233ED162067497EE2E3 /* FocusView.swift */; }; + 0CDAAF2B3729A02854447210 /* AskChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C234AF77E7451A1505DDF9 /* AskChart.swift */; }; + 0D37699776684FD04F8D9D07 /* ProtocolClassifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */; }; + 0D622C67AB136A6F14708CA6 /* IPCServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC8A0C2D83843716604FD3F0 /* IPCServer.swift */; }; + 0D7D15BD7081161D53ED1578 /* InspectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15E51941A085C6B16AF395BB /* InspectionController.swift */; }; + 10776A2B276E82BD07243E07 /* DeviceModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD774DADE526BE4F507BE06C /* DeviceModels.swift */; }; + 118B4F7C72898BC0091B8F6A /* GlobMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */; }; + 1203A91F64B3D15431700D4F /* GuardrailEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15456E37F11CE5E19A124753 /* GuardrailEngine.swift */; }; + 120C7E644032F70B351DB87E /* AgentWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E79F3A686C0EC5D7B28E8C /* AgentWorkspace.swift */; }; + 124C56A74E24D77F75AA8D08 /* HTTPHostParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */; }; + 13299931E36F0173B3FCDC1B /* BlockEnforcer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6FB03454241CB84A9AA13 /* BlockEnforcer.swift */; }; + 1438E3A19D4B0225397E92F7 /* HostCanonicalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */; }; + 145E54492C15FDD359B6DB08 /* InsightsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C0843B4BD70F8F83167F2D3 /* InsightsModel.swift */; }; + 149824D7E5DBBF87A16CFBDB /* TLSSNIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */; }; + 14ACBD3AE23905CA5DA965CB /* RulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88962BAF6E215B83FE0AFF9A /* RulesView.swift */; }; + 155D31587F84936506FDEBB2 /* ProcessNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F3F458498856491A40E88C /* ProcessNaming.swift */; }; + 157717AA8B338201B7C3B4C7 /* FlowlightExtension.systemextension in Embed Dependencies */ = {isa = PBXBuildFile; fileRef = D1C046DCF0CB1227CA93DA24 /* FlowlightExtension.systemextension */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 18F94A8B0CE6DD3B1714C5DC /* DNSParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D61C3343882268C81871C9B /* DNSParser.swift */; }; + 1ADF39B07A56B2AFFC721C1B /* ExportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E01AEB9AB4F8723FFFA4BFB /* ExportTests.swift */; }; + 1C699CA261A1C0963BF36120 /* BoundedHTTPDataTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D5C4691F1B4DFDDCC1A705 /* BoundedHTTPDataTransport.swift */; }; + 1C837EBCE2110C53FB85C886 /* AnomalySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F61F7D8D3D08054C7697792D /* AnomalySettings.swift */; }; + 1D11256FDE7183EBBED5D308 /* BoundedHTTPDataTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D5C4691F1B4DFDDCC1A705 /* BoundedHTTPDataTransport.swift */; }; + 1D997A2137B9445F4D423737 /* ProcessNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F3F458498856491A40E88C /* ProcessNaming.swift */; }; + 1E0AB61964E7FD024B5B4E71 /* AgentPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */; }; + 1EC06D8718C4B684BEF492D4 /* Focus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC957336FC5BD77D7A81651 /* Focus.swift */; }; + 1F1CF3F7D03FBB27616B2200 /* InspectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15E51941A085C6B16AF395BB /* InspectionController.swift */; }; + 1F8686DCB3451158B115A8FD /* AgentLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440DB80190A1847AC834210D /* AgentLauncher.swift */; }; + 2072AA79A8637D84267BE43F /* MCPDomainsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34AD2BFFA35727FB39287960 /* MCPDomainsTests.swift */; }; + 216BDAB2AB83A06B61EE6325 /* InstalledApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = F67F3203B4BE2D664F3B1EC9 /* InstalledApps.swift */; }; + 21D7D0DF6C5DF97EB3D1EFD9 /* RulePackCatalogComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = E858E52F162361C6FD039F16 /* RulePackCatalogComposition.swift */; }; + 22B534F23EF9F05AE27A6D71 /* FeatureGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D568056D9E6FACAC42D563 /* FeatureGuide.swift */; }; + 239189796A5B358CF23BFCF9 /* MockRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8406C2280A8FF08E883A1E0 /* MockRulesView.swift */; }; + 23CC0B3EE557E6F247EC4100 /* RuleEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08643257F8D11784563BD6CC /* RuleEditor.swift */; }; + 24582219230DE364D6B2E2D1 /* BlockingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F529FE0E06B11298D8CD1E90 /* BlockingTests.swift */; }; + 2497E16386CDFE769EFB0EF6 /* RulePackEditorDraft.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089476A21B8A6AE7F3F4A53A /* RulePackEditorDraft.swift */; }; + 2499CE8E13B7B57DDA281E39 /* AgentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8F91DE12A1C58BB2BD7038 /* AgentTests.swift */; }; + 2504E2CFD3C6AFA86FDC86D3 /* InspectionBudget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF0ACB7FCA10D7758DE177D /* InspectionBudget.swift */; }; + 255816A7B82038B2B9780E24 /* TrafficMonitorRulePackStartupTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCA8D35E21C4BC1F15368DE3 /* TrafficMonitorRulePackStartupTests.swift */; }; + 2560A34A00122DEF53A1C407 /* ProcessResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F2F1F8536857610FB4C9854 /* ProcessResolver.swift */; }; + 268A7C1C22F1C06F7B6DA52C /* AnomalySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F61F7D8D3D08054C7697792D /* AnomalySettings.swift */; }; + 26C4AD2122DB5A299CA57CE6 /* RulePack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10036A17CDFCA45E068708EE /* RulePack.swift */; }; + 26D43E956CC67CECE784EF26 /* RulePackEventDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15168A448857A6CC759F7BB /* RulePackEventDelivery.swift */; }; + 274EE87B6A63D7F18C0D0E1E /* DeviceModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD774DADE526BE4F507BE06C /* DeviceModels.swift */; }; + 27B5D51389021FC95AAB2530 /* MockGate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC8A1658834152DBFBA4494 /* MockGate.swift */; }; + 27DC00A62F0BCEE6B1FC2B07 /* Focus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC957336FC5BD77D7A81651 /* Focus.swift */; }; + 280B869A858715537934AC50 /* DNSParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D61C3343882268C81871C9B /* DNSParser.swift */; }; + 28A7A4AF29B86B1927DBF4D3 /* Guardrail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A65C830B699BC4477CA879 /* Guardrail.swift */; }; + 290D1B10464B9915C1505610 /* RulePackEventDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15168A448857A6CC759F7BB /* RulePackEventDelivery.swift */; }; + 2A1BCAACA256067CD96D1066 /* AppleSystemApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16976C5552006B1F9975A62 /* AppleSystemApps.swift */; }; + 2AE5BF2C6ADA89975EA76B83 /* AskQueryRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD71004CFB571B9167866770 /* AskQueryRunner.swift */; }; + 2AFEE6E1F9393DE9D219552F /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */; }; + 2B6D1084BEC5D8FD8C1340B8 /* RuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EEA2706008C57CB75FB17CD /* RuleTests.swift */; }; + 2C879C6EA95A548B2BC9D9DB /* Guardrail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A65C830B699BC4477CA879 /* Guardrail.swift */; }; + 2D10E8EE0B452C5746D2AF73 /* AgentCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */; }; + 2D89FAAC905437BEC596808B /* ProxyJanitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18286421CD591157CF1E1FD /* ProxyJanitor.swift */; }; + 2DADC58723CCECF67EAC1613 /* ExtensionRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1218F146542CC01A417469F9 /* ExtensionRecovery.swift */; }; + 2E110029B0BE1C39A967E0CA /* CertificateAuthority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6652559787FD52622A19834A /* CertificateAuthority.swift */; }; + 2F2E867F1E599C48EC6DE525 /* RulePackTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */; }; + 2F805A324684FF8CB7E0297B /* HostCanonicalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */; }; + 2F80C3268E914A2041232706 /* TLSSNIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */; }; + 30733BCFC01E165EFF02EBA2 /* DestinationProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62A00EA0C0D8B7844E6F7B2 /* DestinationProfile.swift */; }; + 3144B2FBE6DEA543CA36D1CD /* LLMToolCalls.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFAEE09994253E82748BCCCB /* LLMToolCalls.swift */; }; + 315C5531C14F1DDE99043A18 /* DeviceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC1036E5ABBFDB8740405F3 /* DeviceStore.swift */; }; + 32FCEAF70EBFB57EA5579E96 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BAF46D43D2171398478FC3 /* Rule.swift */; }; + 3570CB0F911ED4160DC8F4BD /* AppleSystemApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16976C5552006B1F9975A62 /* AppleSystemApps.swift */; }; + 35B3F93219A8854FFF1D3EEF /* OnDeviceAsk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EEDBAB278885D747B420AD3 /* OnDeviceAsk.swift */; }; + 3607E7DD7A3ABB2C73955832 /* ExtensionTrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95761708CD76CABDF0696BCE /* ExtensionTrafficSource.swift */; }; + 361DD804991495DEEE15121C /* IPCProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */; }; + 362251769AB9DAC1BF063FD0 /* RuleTemplates.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD00CA1EF2A7DA909E3A31B5 /* RuleTemplates.swift */; }; + 3654D301BB54F59D172A1668 /* ProxyRelaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BDAE5D54ABFD08CCFFE447 /* ProxyRelaunch.swift */; }; + 36F61F7BAE54F429B4C19D22 /* Motion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 992F80EF7B17CA25C7D83AC8 /* Motion.swift */; }; + 37BAEA33191AFCF7EED18540 /* BlockRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */; }; + 381C9AC13AAA9CC8D1DCD8FD /* CertificateAuthority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6652559787FD52622A19834A /* CertificateAuthority.swift */; }; + 3860DCC8B5AF2121D11144DE /* InspectionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCB2008E4820D1DE1DE154F /* InspectionRecorder.swift */; }; + 3900BC10AB6AE27C341962CE /* AskQueryRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD71004CFB571B9167866770 /* AskQueryRunner.swift */; }; + 3A12FB5ECC1D6C88CE759CFC /* AgentPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */; }; + 3A195005D8A4580FADEC59A9 /* HTTPDataTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C34C9D0A9B302B4CF4C7125 /* HTTPDataTransport.swift */; }; + 3B1CF30E04CBAAD0EC92DC5B /* ExportModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF216452A0F90D9E90A6BD34 /* ExportModels.swift */; }; + 3BB8B3792AD8FFCDE2B0897A /* ToolResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7703953570391821257DD /* ToolResults.swift */; }; + 3C257D9C841FEE3F373EA661 /* JSONValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D9926D17DD57B7F97E895C9 /* JSONValue.swift */; }; + 3C3AAF8E67A81B9447144BE2 /* BPFProgram.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CA8150CA012929A40558FB /* BPFProgram.swift */; }; + 3DB4B694F1FBA50E559F7D9B /* Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33480D5241332B3AA21CBE49 /* Localization.swift */; }; + 3E265CB16F7C94A36ED3D11E /* NetworkChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59A21E183B79E3C66146070D /* NetworkChannel.swift */; }; + 3E591F9FC749BBE46FE5C100 /* RemoteAsk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91657F4898EFEBCB551ADD4E /* RemoteAsk.swift */; }; + 3EB92870A15033FFE64CA6A4 /* FocusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FB4666B2D07DDE032C87EC /* FocusTests.swift */; }; + 3F09CA57A97AA100EAA0FC26 /* AppRestart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA4611687EF2F8AADA58A49 /* AppRestart.swift */; }; + 3F90E760FD34949F451FBDF4 /* ExportDisclosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF2DEA93C3D6844E3345D2D8 /* ExportDisclosure.swift */; }; + 3FBACA5ECB1C08ED614FDDE7 /* LocalRiskViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461E9D1F76A4F9505335AB87 /* LocalRiskViews.swift */; }; + 3FE68A4EC4BEA3A2B81D069E /* LiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4408358C5CC9516B4C1ABCB /* LiveView.swift */; }; + 41033D5CF2A9446276DADB97 /* AlertsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB04B24A750D5362449F8197 /* AlertsView.swift */; }; + 413D6E44997AA769C597FF23 /* RulePackCatalogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B40E5AD74F74A029AD46E4 /* RulePackCatalogTests.swift */; }; + 41750EE3E0461E85FC71FBAF /* VersionNameRepairTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F05A2DD30C79643247AF74C9 /* VersionNameRepairTests.swift */; }; + 41EEA62E4E2A0DDC2FA6C7AC /* ExportVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2A4754CFE5FD187CAF66AD /* ExportVisibilityTests.swift */; }; + 42E39E8ADC51DA39DE0784AD /* Motion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 992F80EF7B17CA25C7D83AC8 /* Motion.swift */; }; + 42F74C2DB00410D8FB790B70 /* BuiltInRulePacks.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD4C8B6E3620F5E46C69434 /* BuiltInRulePacks.swift */; }; + 4323C68638C74F3E8D02FA65 /* PluginPackageVerifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C96560CB05BDDBB136E34B /* PluginPackageVerifier.swift */; }; + 43329736A36E1C4367881E40 /* LocalRiskSettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662F0B94BED1CA47AD516AC9 /* LocalRiskSettingsSection.swift */; }; + 4453A6861DA4D5A8AE3CC793 /* AskChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C234AF77E7451A1505DDF9 /* AskChart.swift */; }; + 451AB2522DC0E73CF1301EE1 /* FlowlightApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3244269609CC161996866B5 /* FlowlightApp.swift */; }; + 45C6C2569D63744568474B91 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F186517132592B36ED2B9F80 /* main.swift */; }; + 46A21D07D20963DBAC9169F6 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 9EF395A2F3D6C97FF9EC53E4 /* index.html */; }; + 46E686B76B70B444AA375FBC /* RewriteRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA3B4EB0E0D40E39CE24E1B /* RewriteRule.swift */; }; + 4767B9EBDCBFD6B3483079B2 /* NetworkScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */; }; + 47F1C0E114B1AFD567C42792 /* ResponseGate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA9340FE2B6C417D1A19AF54 /* ResponseGate.swift */; }; + 48170BB139B744FAD6513959 /* Guardrail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A65C830B699BC4477CA879 /* Guardrail.swift */; }; + 48330DCACD790F31E072D0B3 /* MCPAttribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37FE9D6F8BA82F3C266E147A /* MCPAttribution.swift */; }; + 489DB4725FD189472CC078BE /* AgentPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B07796D1108F037FF196443 /* AgentPolicyTests.swift */; }; + 48CD1538B6B7899F0B8A83E8 /* official.json in Resources */ = {isa = PBXBuildFile; fileRef = ADDB360F7DA88D34505F4D8A /* official.json */; }; + 4947873A05817C02C14E461D /* CoverageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C69EEECAA62FC98DBC8CB2 /* CoverageView.swift */; }; + 498E9916E85245C7982E9110 /* LocalRiskAnalysisTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FEF0DA4ACD3157DA6FA4B3 /* LocalRiskAnalysisTests.swift */; }; + 4A0EDDA9455A32B4A43F42FF /* AppleSystemApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16976C5552006B1F9975A62 /* AppleSystemApps.swift */; }; + 4B0B6CA666157D7B72A8F511 /* LocalRiskViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 461E9D1F76A4F9505335AB87 /* LocalRiskViews.swift */; }; + 4B7736E9D3BEAB93A4AA8B4E /* ToolResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A7703953570391821257DD /* ToolResults.swift */; }; + 4BAEC22536747CFB9525934A /* ExportDisclosureSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA72D307E4B1A08BE4B8AEF8 /* ExportDisclosureSheet.swift */; }; + 4C028FF54CB024B6DAEA2DBA /* HTTPHostParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */; }; + 4D676BCFC2B27CB77015BDFA /* FocusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61080233ED162067497EE2E3 /* FocusView.swift */; }; + 4EF5727ADC37F80E20EF4327 /* TrafficMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC0A436E879000F8F5FF9E7 /* TrafficMonitor.swift */; }; + 4F732CB0B9C2FB627217CC17 /* RulePackCatalogUpdaterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8507D8801643823A18134BF8 /* RulePackCatalogUpdaterTests.swift */; }; + 4F929BE1C94FDF359E1B0F39 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */; }; + 50CD7EF8F4121F7DD1C65680 /* RewriteRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44CCD94E9D554D6DD61486FF /* RewriteRulesView.swift */; }; + 51694FE8AB65C2BC3BD5B21D /* GuardrailsPane.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F08D1913575FFC1F548CAB5 /* GuardrailsPane.swift */; }; + 518B305308454622B576FF3B /* HostCanonicalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */; }; + 52A067CD50920CBDEC98A32F /* Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33480D5241332B3AA21CBE49 /* Localization.swift */; }; + 55434CF888AEE73E90EDA953 /* UpdateVerificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FEECAD5C958CF49A659E14 /* UpdateVerificationTests.swift */; }; + 55FB36AE92AEF84914CCA6E8 /* RuleTemplateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 254FA06DF59A8410C9BAE161 /* RuleTemplateTests.swift */; }; + 56AE97B7A55B1A70250CAA57 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */; }; + 574A061E9456AD6BD7E3AB5A /* RulePackCatalogUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738E050AC8811051BF14E529 /* RulePackCatalogUpdater.swift */; }; + 57DADB20CBF7D6EF6F6B8167 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 77D58ED5F4678FC1C2A5634A /* Localizable.strings */; }; + 585CA811DBF12784CBF086EA /* AgentWorkspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09E79F3A686C0EC5D7B28E8C /* AgentWorkspace.swift */; }; + 58EB211C6C5B91A0435C5E11 /* PluginScriptRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = E593C4ED11E1BCADD22099E6 /* PluginScriptRunner.swift */; }; + 593C3A02860F39DAC8019A1E /* VersionNamingRegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED54978358DD9DE1E792A8B9 /* VersionNamingRegressionTests.swift */; }; + 597FCA0655D52D801C0542F4 /* RuleSimulationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B910FBB81CDAC17AE5ACCEA /* RuleSimulationView.swift */; }; + 59D83ED863E01486B578B923 /* ResponseGate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA9340FE2B6C417D1A19AF54 /* ResponseGate.swift */; }; + 5A2A8DF18D3C1FC584DAFBEB /* IPCProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */; }; + 5A3B1EB5936B67AD426A5967 /* NetworkChannelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADD9D2D024F76347C8414BD5 /* NetworkChannelTests.swift */; }; + 5A58E6A00FD4F35DA506B390 /* RuleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97943E847A22CF491FA82084 /* RuleStore.swift */; }; + 5AA48BB88F9E0F6F858DC553 /* BluetoothMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B6A48D086EF16CF6E438FF /* BluetoothMonitor.swift */; }; + 5B0715A36BAB76BC06AE4052 /* FlowTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8267406A5D7DA536B7A713 /* FlowTracker.swift */; }; + 5D637AB4C3D308EAC8CC9448 /* RulePackDeliveryStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48B24C254E2C17056730C06B /* RulePackDeliveryStats.swift */; }; + 5E22345FC07C19F4A32C5002 /* RuleEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08643257F8D11784563BD6CC /* RuleEditor.swift */; }; + 5EC8847DF0E49875B602B9AA /* ExtensionRecoveryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2747CAE7AD41663488F0E2B9 /* ExtensionRecoveryTests.swift */; }; + 6034C069D97EE923799AC9B2 /* FlowlightStoreExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 9341EDA5AB3454E82FECD53A /* FlowlightStoreExtension.appex */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 603AE25B0614892F454FE15B /* RulePackCatalogState.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4ADEE1B3578FBC6DFD9B74 /* RulePackCatalogState.swift */; }; + 607A677F2CEE245D16249316 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */; }; + 61648ED4A0DBCEC775673448 /* ProtocolCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */; }; + 623C50C16EB5A7DCA225F775 /* PluginEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A1C1F3361CA62C0D08C168 /* PluginEngine.swift */; }; + 62885CD8C265122129AF78FF /* RulePackCatalogVerifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35EF76A8728F308E2D6973A /* RulePackCatalogVerifier.swift */; }; + 62ACF7BF40AB81E4CB9E4478 /* DNSParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D61C3343882268C81871C9B /* DNSParser.swift */; }; + 631C449B074FB7E31D887EFC /* PluginModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F902D9D498F399BBDD85E0 /* PluginModels.swift */; }; + 63CBA5AACC00FC44C982ADAF /* AgentLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440DB80190A1847AC834210D /* AgentLauncher.swift */; }; + 643D3B8316459A2CEFBA261F /* NettopTrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957EEA0C3C7342504E533506 /* NettopTrafficSource.swift */; }; + 64453A2D3AA57975F870BAE4 /* ExportDisclosureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCF7C56CAF72886BEB812F8F /* ExportDisclosureTests.swift */; }; + 6464CE699E3EE225BA57C0EF /* DemoInspection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FFEA980768CD488D58CC0B1 /* DemoInspection.swift */; }; + 64D1D0E76973447B888270C1 /* PluginEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A1C1F3361CA62C0D08C168 /* PluginEngine.swift */; }; + 6514A22112924B2965D507DE /* OnDeviceRiskProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F1DEAAAAAA607CEA5EC303 /* OnDeviceRiskProvider.swift */; }; + 653556BA776A6E7755D3DD53 /* ExportPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FD3230056607B454EAC381D /* ExportPayload.swift */; }; + 654EE33CAE5B208F04985952 /* HTTPHostParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */; }; + 657B4D3A0DC9860BCAA78E25 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15AF59D58B332F548630D949 /* ParserTests.swift */; }; + 65A926A0C3E7431E89CDC7FE /* AlertsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB04B24A750D5362449F8197 /* AlertsView.swift */; }; + 65C108E51ADCFAE65FE2C8AA /* WindowVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70965BF26E0B4B3F9719122B /* WindowVisibilityTests.swift */; }; + 65DE86F9DCCC5A1293FC29E2 /* SQLite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9FCA36BD4A101EA1F02DFF /* SQLite.swift */; }; + 65F285392A51B100F8FD2BBA /* NetworkScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */; }; + 65F6E16AC002847C032ECC48 /* ExportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C6211A645D4DDF8526DF2 /* ExportController.swift */; }; + 66605C2D5AE7B9D23E83AF0E /* SystemExtensionScanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2DD7D42B7798A6C57F8C49E /* SystemExtensionScanTests.swift */; }; + 668FFA90C24788C66043286B /* TrafficModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */; }; + 6794B84FCA2A7991AD670BDA /* OnDeviceRiskProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74F1DEAAAAAA607CEA5EC303 /* OnDeviceRiskProvider.swift */; }; + 679B74263454FB76473F1006 /* CaptureWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61823557D86136986EEE4A18 /* CaptureWarning.swift */; }; + 67F5BAFB0D59F3692C418D0C /* RuleStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97943E847A22CF491FA82084 /* RuleStore.swift */; }; + 697ACED9A5F7CF5854461210 /* ResponseTransformTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ADADFFC230017F80D707ECE /* ResponseTransformTests.swift */; }; + 6BE9B797667820AD0E72D789 /* RemoteAsk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91657F4898EFEBCB551ADD4E /* RemoteAsk.swift */; }; + 6C3AC854882827BEA6A2B9CB /* TLSSNIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */; }; + 6C42E5ECB1F31F42DDD421F7 /* RulePackCatalogState.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4ADEE1B3578FBC6DFD9B74 /* RulePackCatalogState.swift */; }; + 6FC332766A183D00E84656E3 /* Components.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C1CF4C48AA260D71155C022 /* Components.swift */; }; + 70584ACFC97B4A66381BDF95 /* AnomalyEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21A2E14BFE5E66664D0A604B /* AnomalyEngine.swift */; }; + 705BEA6B331562969B8FCD26 /* ResponseTransformRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB223BC3AD00430A5673C439 /* ResponseTransformRule.swift */; }; + 70B794AEAC36D7B581841A5D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 615E4FAE5D0865FB1E2492E8 /* Assets.xcassets */; }; + 70CD0A27AAF526B9BB07BBAE /* DevicesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2FBA5700CA1489D6740FC8 /* DevicesView.swift */; }; + 7212BA0F348AC67423887CF5 /* DNSParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D61C3343882268C81871C9B /* DNSParser.swift */; }; + 72410A21824E39F8FF1854A3 /* RuleSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */; }; + 72FCD2D719346EDC2EE58A6E /* AskFeatureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94004173EC96619B41EDF49F /* AskFeatureTests.swift */; }; + 7340527787A47AEDF1FE5991 /* GuardrailStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9195A6149AE1C6628A3E184 /* GuardrailStore.swift */; }; + 739AA7451B3E61F2963C3237 /* RulePackEditorDraft.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089476A21B8A6AE7F3F4A53A /* RulePackEditorDraft.swift */; }; + 742203151D5AF7CC2A2C1440 /* DesignTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF0C2E06D541DAEC1BC5F33 /* DesignTokens.swift */; }; + 7471DD6A1CB6304ECCFD0C3B /* InspectScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BC2D26D49B4E14A148BE9C6 /* InspectScopeTests.swift */; }; + 7726A81EF6802B2BC4606540 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */; }; + 7732BE202B8D390C8A9A0DE0 /* LLMToolCalls.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFAEE09994253E82748BCCCB /* LLMToolCalls.swift */; }; + 77E90A284280B87F30A30487 /* ProtocolCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */; }; + 780A2B3FCEDB696FC8FBD4AF /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1D13FDE75AF5064805D258 /* Notifier.swift */; }; + 78D210201D9072B255C058B1 /* FlowlightApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3244269609CC161996866B5 /* FlowlightApp.swift */; }; + 78FD830C8350A22AD11723EC /* RulePacksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CC12B7176A61DD80F12043A /* RulePacksView.swift */; }; + 7A572D1F12B86CB4F91E72A0 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */; }; + 7B995B6E769204525B48DDFB /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 594F3762D9AD6347C83BA710 /* DemoData.swift */; }; + 7BA8D2912D68E61C0523F3B6 /* AskEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611E8788B3B6AF18F1CEDF7 /* AskEnvironment.swift */; }; + 7BE6EA58391841D37FB1117F /* TrafficTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B2FA5540C38FA293E3EB457 /* TrafficTree.swift */; }; + 7C4D73113ECB44CDDAB40D58 /* official.json in Resources */ = {isa = PBXBuildFile; fileRef = ADDB360F7DA88D34505F4D8A /* official.json */; }; + 7C7D39AF8E2C36BE514BF10C /* GuardrailEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15456E37F11CE5E19A124753 /* GuardrailEngine.swift */; }; + 7D0431D1C2B4142A2A3B9A2D /* IPCProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */; }; + 7D613ABDA5085E4150738DA6 /* TrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A370EA2BA551D5351835E6 /* TrafficSource.swift */; }; + 7E1481BA85DDCD19B4972B99 /* AppRestart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DA4611687EF2F8AADA58A49 /* AppRestart.swift */; }; + 7F2257D0029DC85A25033B9B /* PluginModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F902D9D498F399BBDD85E0 /* PluginModels.swift */; }; + 7FBA685D695EA14B08E9F18A /* CaptureAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FD4661C1ABB39E65894AE7F /* CaptureAccess.swift */; }; + 807AB517A5ED9EE6738FD707 /* AgentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81434EE3C45929E8A768D42E /* AgentsView.swift */; }; + 80D7CBA2AE6B117ACC0BE7BB /* SettingsEnforcer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8251DBDC21C44CB92CC1C67 /* SettingsEnforcer.swift */; }; + 80FA6E238AC7FDEE36C05B5C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92FDE4C87CC59491B70BF3F3 /* ContentView.swift */; }; + 81072D7510803E8189EA2671 /* JSONTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23CAA36BFFADC83D65DBF0FE /* JSONTreeView.swift */; }; + 813089B6205B28E82D260539 /* AgentCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */; }; + 8349898AD32AB76CB57C65D9 /* AskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41AE1A6CC673544FCEC9E7F4 /* AskView.swift */; }; + 836D7B339C78B6FC98DD5AA8 /* RulePackTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */; }; + 83B35B9C8D236EA11ED27A43 /* DemoData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 594F3762D9AD6347C83BA710 /* DemoData.swift */; }; + 83E9F19608C25B32DF8C52AB /* RulePackSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */; }; + 846FECA436B94D952C489DEE /* SharedStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC02CB8000B00C4C0AD84E60 /* SharedStrings.swift */; }; + 84E8F07CBD455A23EE2DF978 /* ExportSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B82FFB06C5A1C98D5E4D7D1 /* ExportSettingsView.swift */; }; + 850653E102AF3CD2C3833524 /* ProcessNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F3F458498856491A40E88C /* ProcessNaming.swift */; }; + 858D19CFF01AFC9E3FF8F364 /* AskProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A773537F63761107681A3 /* AskProvider.swift */; }; + 8658DBDD8DE41686E075C7B0 /* DestinationProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22C46B9250A6ADDFD915500B /* DestinationProfileTests.swift */; }; + 8753FD9223EF6AE4C892DB9A /* RewriteRuleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 694D30A62FAF11702B7EF605 /* RewriteRuleTests.swift */; }; + 875CEAD8A14432BD5E46F0DF /* AskController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67763C99431F26FE1D428EA2 /* AskController.swift */; }; + 87B80FD11BAC558198442507 /* TrafficModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */; }; + 87E68C01975E4936B8D6A921 /* AskTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB78709D1E01638E63A484D3 /* AskTests.swift */; }; + 87F047938C7E5461658F8CE3 /* Coverage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC52100D779B101B1B2595F /* Coverage.swift */; }; + 88B1D1AFC30EEFB351A2D10F /* USBMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A903BAF9BBDCFEAEC2F023FF /* USBMonitor.swift */; }; + 897D75C0AEE76F10ADF0CD5C /* ResponseTransformRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB223BC3AD00430A5673C439 /* ResponseTransformRule.swift */; }; + 89B09C7F77A5D116433291C5 /* AgentsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082111849A66652DD9F1BE01 /* AgentsModel.swift */; }; + 89E518A6DD4F49D012E47AFE /* ActivityMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E872723F2D92AA78F7941259 /* ActivityMonitor.swift */; }; + 8A5E37FB8BB6623CEF21420D /* MockRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7FBB33595155CF835AF14D5 /* MockRule.swift */; }; + 8B41FBD2537503B964EC5C81 /* ToolActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2E7474FB6A7B8B56B98917 /* ToolActivity.swift */; }; + 8B74946210FB3616E1F4ACD1 /* SharedStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC02CB8000B00C4C0AD84E60 /* SharedStrings.swift */; }; + 8BD67221A510AAB93D73CC7D /* MockResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E35905A6578A1204796962E /* MockResponseTests.swift */; }; + 8BE14301F6CA5DEF8209A4FC /* BehaviourPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB40E7DB142C886F94FE2448 /* BehaviourPanel.swift */; }; + 8D0ECCF27AEAA38CE6E939B0 /* FilterDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F212ADB3B37A2EF68A7CFB84 /* FilterDataProvider.swift */; }; + 8D0F2F917038A8C52AE9E271 /* UpdateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC0873969A030F170A6AA3F5 /* UpdateTests.swift */; }; + 8D660394CF2B20BC98E53675 /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D210A86033CB79C792000CA2 /* UpdateView.swift */; }; + 8D8D47E8D81B928A8895178A /* ProtocolCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */; }; + 8DAA531E3904A7B356FE2B77 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4849A413C60A9ABC4F9C16E /* SettingsView.swift */; }; + 8F7C96FA3DFC112A72976562 /* TrafficModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */; }; + 8FDF38674C022B58C5E6068F /* RuleSimulationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAD9DD248FDC1D5D58EFC726 /* RuleSimulationTests.swift */; }; + 91433E64078D356DD3940C57 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BAF46D43D2171398478FC3 /* Rule.swift */; }; + 9162E455E37916AAD651349B /* AgentPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */; }; + 931D85D9291D5E557B69BD43 /* PluginSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ACC341615D95ADA623BBEC /* PluginSettingsView.swift */; }; + 93937351BA21608974D54900 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 615E4FAE5D0865FB1E2492E8 /* Assets.xcassets */; }; + 939DB311C31E0F1B33583B8A /* SystemExtensionScan.swift in Sources */ = {isa = PBXBuildFile; fileRef = A617D9483BCC31A0F4200A90 /* SystemExtensionScan.swift */; }; + 93AC6FC795BBEAB3FCFA2C93 /* AskController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67763C99431F26FE1D428EA2 /* AskController.swift */; }; + 93AE87F6497373A647A92DD4 /* USBMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = A903BAF9BBDCFEAEC2F023FF /* USBMonitor.swift */; }; + 9524F078035F746A98A5BD1A /* GuardrailTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A401B3A5D8ED9031EAAF03 /* GuardrailTests.swift */; }; + 953BF001428B13E4B3B04D4C /* AppNavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0158F10AEABEF28A925E8C3 /* AppNavigation.swift */; }; + 969FC166DAA7623081DA7392 /* RulePackTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */; }; + 9767A4CE180F4083B693CC19 /* AgentPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */; }; + 97CE90F39AE2FC5B9E0AD84C /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1D13FDE75AF5064805D258 /* Notifier.swift */; }; + 9814BB05A2FC8648EB62145C /* ResponseTransformRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F8FB5C78D8391B25733C9B /* ResponseTransformRulesView.swift */; }; + 9891F943C7CAD36651D24774 /* ProtocolClassifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */; }; + 9A03509ED600BF1065FD2800 /* MCPDomains.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D6CCA395BF33CDF9F92B725 /* MCPDomains.swift */; }; + 9B22FA903C576B32C9232523 /* DeviceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 638E7A9BEB644503868C49E9 /* DeviceTests.swift */; }; + 9BE0BB0A6D132461427E755B /* UpdateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D210A86033CB79C792000CA2 /* UpdateView.swift */; }; + 9D9CC413EDA13E69B872454F /* BlockRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */; }; + 9DA08B1BDE7F624176CB2AF2 /* FlowJudgementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CFC920FE55E719B46039E1F /* FlowJudgementTests.swift */; }; + 9DA5CB6639FF673FC53D033A /* ExportController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C6211A645D4DDF8526DF2 /* ExportController.swift */; }; + A108B205EE74FC1ADD45FD9E /* CoverageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1C69EEECAA62FC98DBC8CB2 /* CoverageView.swift */; }; + A147D607E84B5B0B102C824A /* RulePack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10036A17CDFCA45E068708EE /* RulePack.swift */; }; + A1DE70B1FFF145A8057E85C4 /* UpdateInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121FF2EBC93394E8EDCFF0BF /* UpdateInstaller.swift */; }; + A224249AD83D44E25C293EC3 /* HTTPStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8974956FEBD82934CA1EB5 /* HTTPStream.swift */; }; + A3417EC0EF2DD2A4D35CAAB5 /* ExportQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 719C08673D2446F21DAF9F54 /* ExportQueue.swift */; }; + A3FF156082D5E00D561A7099 /* InsightsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FA151AA64480DAACC602123 /* InsightsPanel.swift */; }; + A48DC12BB97A0E5499A3D87D /* ExtensionTrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95761708CD76CABDF0696BCE /* ExtensionTrafficSource.swift */; }; + A4CEEDBC97449B58C674CD4F /* ProcessLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489125D1DBF3EF98AEED4EB /* ProcessLookup.swift */; }; + A6B2B75108CE6233CD3EDF00 /* InsightsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C0843B4BD70F8F83167F2D3 /* InsightsModel.swift */; }; + A7369F9D640FCFDAC459E5F6 /* CaptureWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61823557D86136986EEE4A18 /* CaptureWarning.swift */; }; + A78C8671BF1CC788E969814C /* ExportPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FD3230056607B454EAC381D /* ExportPayload.swift */; }; + A8347F99B5A1857DDF39D56F /* RulePackCatalogVerifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35EF76A8728F308E2D6973A /* RulePackCatalogVerifier.swift */; }; + A83BA0983BAC28C6E56B49BE /* MCPAttributionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02EE3A99F49A058BF061C147 /* MCPAttributionTests.swift */; }; + A8869D4F16D83EC7120D901E /* PluginStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55A095537DB24454B007D1B /* PluginStore.swift */; }; + A912218AF0A00A7FB4EE5221 /* InsightsPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FA151AA64480DAACC602123 /* InsightsPanel.swift */; }; + A9675AD6413CA1740A75CE8F /* JSONValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D9926D17DD57B7F97E895C9 /* JSONValue.swift */; }; + AC5E1A01FEBC6A4C9951353E /* RuleSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */; }; + ACC7529D79C19667761AEAD2 /* RulePackEventDeliveryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB0C0840C443F8AEDD254AE0 /* RulePackEventDeliveryTests.swift */; }; + AD57CBF846824C0BE9878BF1 /* LLMFacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95765A2F0D026D17736C9D9D /* LLMFacts.swift */; }; + ADC857099AB3E324DEC334BC /* ProxyJanitorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45076E14820DDD4CFF352226 /* ProxyJanitorTests.swift */; }; + AF1BB39DC13C09CAC6253943 /* ProxyJanitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = C18286421CD591157CF1E1FD /* ProxyJanitor.swift */; }; + AF8A26B4F8FFA3C94F0D276E /* InspectionProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD96902AACB4B557DEFFBCD /* InspectionProxy.swift */; }; + AF9E41AC8E40F018E642A73E /* MockRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7FBB33595155CF835AF14D5 /* MockRule.swift */; }; + B0140F7BF021D067E67BF817 /* GuardrailStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9195A6149AE1C6628A3E184 /* GuardrailStore.swift */; }; + B13CAA0E1DA5A274F3F4D849 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */; }; + B141482792DF3953D575CFF9 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A12EC605B35B8042A369205 /* libsqlite3.tbd */; }; + B1DCF272AD61D6284A4D63BD /* RulePackDeliveryStats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48B24C254E2C17056730C06B /* RulePackDeliveryStats.swift */; }; + B1E5CA21DA13E924DD50CB51 /* AgentAttributor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41B98E13F994F7E684F57C07 /* AgentAttributor.swift */; }; + B3D4CAEA3D9EB39E1B7BCBA7 /* TrafficMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC0A436E879000F8F5FF9E7 /* TrafficMonitor.swift */; }; + B40A4A6A12B15C206C69FE22 /* BodySearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B95789E8FFF77D3182BADCF /* BodySearchTests.swift */; }; + B4A39C2F0D1B775D59ADC50C /* AskQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 415931FB0EB29261A56B90C7 /* AskQuery.swift */; }; + B4C83BAE6447273B72D237AB /* ProxyRelaunch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BDAE5D54ABFD08CCFFE447 /* ProxyRelaunch.swift */; }; + B5614834E9118B531713207A /* NetworkChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59A21E183B79E3C66146070D /* NetworkChannel.swift */; }; + B5A31798C953DDD61039E82D /* ExtensionRebootTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC63F61F2956394B88C762F4 /* ExtensionRebootTests.swift */; }; + B5E88F4AF351CB717C46B22E /* ResponseScriptRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D6646248D4CDF3EB86A893 /* ResponseScriptRunner.swift */; }; + B5F94B9F6FC2B75A867FB2F8 /* official-rule-packs-v1-public.pem in Resources */ = {isa = PBXBuildFile; fileRef = 1F49F6CFAF06DFBB9416246D /* official-rule-packs-v1-public.pem */; }; + B766E7284317D94D160C1386 /* AppleSystemAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF28074238079D33EFB6B862 /* AppleSystemAppTests.swift */; }; + B7D99A1E19A198CB04FDDC73 /* NetworkChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59A21E183B79E3C66146070D /* NetworkChannel.swift */; }; + B80FC9A3A8F21AFFCF5149A9 /* IPOwnerLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6B4B0B76D53D8089C95762F /* IPOwnerLookup.swift */; }; + B87A6542EDA6ACDB5B961EFA /* CoverageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD012519AD3D674CC0D35FC /* CoverageTests.swift */; }; + B88D4DE798915EA469DF73B3 /* PacketSniffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F062E6D35F98D8EEF1EBE47C /* PacketSniffer.swift */; }; + B8AF34F3100E3ABF6190BE68 /* FilterDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F212ADB3B37A2EF68A7CFB84 /* FilterDataProvider.swift */; }; + B8B770675C09113D28BDF3F1 /* SettingsEnforcer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8251DBDC21C44CB92CC1C67 /* SettingsEnforcer.swift */; }; + BA072680D0A6AC1C40DB8608 /* Components.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C1CF4C48AA260D71155C022 /* Components.swift */; }; + BA5C8DE36B0484931B6652E0 /* ProcessLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = E489125D1DBF3EF98AEED4EB /* ProcessLookup.swift */; }; + BB4533F39F79A5D13D438C34 /* ExtensionRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1218F146542CC01A417469F9 /* ExtensionRecovery.swift */; }; + BBCAB0EE0D040C8BF3E30556 /* TLSSNIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */; }; + BC092B149B32D158A62ADB8A /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C087727B358A400DCFD7E0E6 /* JavaScriptCore.framework */; }; + BC84D4873C2547F075562715 /* LocalRiskAnalysis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93E71941B27710D83594A6C5 /* LocalRiskAnalysis.swift */; }; + BD91747457B98A2408D1977D /* MockGate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAC8A1658834152DBFBA4494 /* MockGate.swift */; }; + BDF6030BBFAE6327B278A128 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */; }; + BEC1503B1920AF74D38E2077 /* RulePackCatalogPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1C1786F72F8D0BC95B9BAC /* RulePackCatalogPersistenceTests.swift */; }; + BF013D373CC9FFFAD75B9C22 /* InspectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE93ABADFF46C961FCABAB8 /* InspectView.swift */; }; + BF89D9E22CBBA7B5ACBD491B /* GuardrailsPane.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F08D1913575FFC1F548CAB5 /* GuardrailsPane.swift */; }; + C030AD2D9C98160C80D356AD /* FlowTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8267406A5D7DA536B7A713 /* FlowTracker.swift */; }; + C05C1729B55B00FC0AF1C20C /* AgentLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 440DB80190A1847AC834210D /* AgentLauncher.swift */; }; + C066C0BE0A8B0C621654095F /* LiveView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4408358C5CC9516B4C1ABCB /* LiveView.swift */; }; + C07CFCE9876D9F55F8BA9C25 /* FlowlightResponseScriptHelper in Embed Dependencies */ = {isa = PBXBuildFile; fileRef = BD0D85E63A3FEC65FE1FD068 /* FlowlightResponseScriptHelper */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + C094B24A112FF0FE00623E9F /* TrafficTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B2FA5540C38FA293E3EB457 /* TrafficTree.swift */; }; + C2587EAF39C9E71650F3B6FC /* EnrichmentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89C74F92FC42AE36F5D97F1F /* EnrichmentTests.swift */; }; + C35F10A4B87D29525A740DD5 /* AgentAttributor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41B98E13F994F7E684F57C07 /* AgentAttributor.swift */; }; + C456CD5C4C3C603419925D58 /* NetworkChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59A21E183B79E3C66146070D /* NetworkChannel.swift */; }; + C49DD542101E64D0EEBD05E4 /* ExportDisclosureSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA72D307E4B1A08BE4B8AEF8 /* ExportDisclosureSheet.swift */; }; + C4F66F4C8F679F53C70399D6 /* MCPAttribution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37FE9D6F8BA82F3C266E147A /* MCPAttribution.swift */; }; + C5077734C82AD352CC3EFA5C /* BlockRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */; }; + C513F5D1936E202D0D6ECEFD /* BuiltInRulePacks.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD4C8B6E3620F5E46C69434 /* BuiltInRulePacks.swift */; }; + C558099602CDA3A231384EBD /* InstalledApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = F67F3203B4BE2D664F3B1EC9 /* InstalledApps.swift */; }; + C57A3811A5DB984FC0F2549A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 77D58ED5F4678FC1C2A5634A /* Localizable.strings */; }; + C5E82EFABFE12297251D924C /* BlockRules.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */; }; + C62FF7278DAD93AB68B2FFF1 /* WindowVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = E45902808344F173033EB0F5 /* WindowVisibility.swift */; }; + C646009EEAACFFED739EA0E9 /* InspectNavigationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E4E7F1E8B83D086AF0CB1B /* InspectNavigationTests.swift */; }; + C6B736C06DB70C19217FA5AE /* PluginStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55A095537DB24454B007D1B /* PluginStore.swift */; }; + C6E8C518995B36DB53128B05 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A12EC605B35B8042A369205 /* libsqlite3.tbd */; }; + C72889236AE51E71206B2F57 /* ExportQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 719C08673D2446F21DAF9F54 /* ExportQueue.swift */; }; + C7798BE6AE9C79EB8BA3576C /* AnomalyEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21A2E14BFE5E66664D0A604B /* AnomalyEngine.swift */; }; + C7B4D535CFF9FA9D0DE8D708 /* RulePacksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CC12B7176A61DD80F12043A /* RulePacksView.swift */; }; + C7FAFFB62ADB58699720440A /* ExportSecrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AE72E8F916C18A468E968A /* ExportSecrets.swift */; }; + C85056033D72ECD693E4AE7A /* RulePackSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */; }; + C9E61A29C4EA61E978DF7C1A /* ToolCallLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98FE7804F3D1F6A247F0C8DF /* ToolCallLinks.swift */; }; + C9F9F6FF27500A2CB5BE992B /* SQLite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D9FCA36BD4A101EA1F02DFF /* SQLite.swift */; }; + CA9FF629E45A3643774DDACD /* InspectionBudget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF0ACB7FCA10D7758DE177D /* InspectionBudget.swift */; }; + CAE2EEC350E48F001B343DE1 /* ProtocolCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */; }; + CAFBA60EFEF3BB7D4F8D38E9 /* Guardrail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A65C830B699BC4477CA879 /* Guardrail.swift */; }; + CB731DCD258C0048C4FECDF2 /* MockRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8406C2280A8FF08E883A1E0 /* MockRulesView.swift */; }; + CC282F84A0B0F97D5007F449 /* AskQuery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 415931FB0EB29261A56B90C7 /* AskQuery.swift */; }; + CD507B163DA11479FAFBF2A6 /* ExtensionSourceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2EB4E838E550B396BDB883 /* ExtensionSourceTests.swift */; }; + CDFFBF64E8D14CAB558D87F7 /* CaptureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9F2521A73E6E3264F557E6 /* CaptureView.swift */; }; + CE0458FD46CC7EF3A1379B53 /* ResponseTransformRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8F8FB5C78D8391B25733C9B /* ResponseTransformRulesView.swift */; }; + CE1589D1A40B2EC1084C7A88 /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BAF46D43D2171398478FC3 /* Rule.swift */; }; + CF16C383C4E52E86951F7B17 /* RulePackStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B5736850B28B462739C2CD /* RulePackStore.swift */; }; + CF2049DA978EB9588596556F /* RulePack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10036A17CDFCA45E068708EE /* RulePack.swift */; }; + CF8EE120DA5241445ECD1797 /* DeviceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC1036E5ABBFDB8740405F3 /* DeviceStore.swift */; }; + CF9E8E6FBFB1D1DBD7610DA1 /* ToolCallLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98FE7804F3D1F6A247F0C8DF /* ToolCallLinks.swift */; }; + D10DE307D1AD32A7D8173A41 /* HostCanonicalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */; }; + D211B6AF0F0C9ABE3F5D1A57 /* LocalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0F9AC24A75E20F3FA0B2BB /* LocalizationTests.swift */; }; + D30A985B88E65A6F89E9E7E7 /* UpdateChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C9C36E21D6DB161C80DF3F6 /* UpdateChecker.swift */; }; + D30F3B5A02E089EEADBDE98B /* ActivityMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E872723F2D92AA78F7941259 /* ActivityMonitor.swift */; }; + D3EB4913132CAEA7FA827B08 /* CaptureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9F2521A73E6E3264F557E6 /* CaptureView.swift */; }; + D4B24A76368B295B8DE8EC0B /* RuleSimulationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B910FBB81CDAC17AE5ACCEA /* RuleSimulationView.swift */; }; + D57246BD18C4FBBCEA71F08A /* InsightsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2A5AC7D1719857AE8ED1CFA /* InsightsTests.swift */; }; + D58E19691840000472807F80 /* MCPDomainsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1888DEE22E9C2FCFB5DC064 /* MCPDomainsSection.swift */; }; + D5C09E269CC11D38728B69FC /* GlobMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */; }; + D5D014F2811B94832DC6CC81 /* bpf-access.sh in Resources */ = {isa = PBXBuildFile; fileRef = 20C95610696E32B96E500E8F /* bpf-access.sh */; }; + D662DA2727A039F0137E0472 /* CaptureAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FD4661C1ABB39E65894AE7F /* CaptureAccess.swift */; }; + D688BB9313DA940E107D8237 /* NettopParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497DF4817317CE033F2A83A2 /* NettopParser.swift */; }; + D690491C9CCCFFA1DE64ECE8 /* BoundedHTTPDataTransportTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 810530D0FFDE61BE5CDB4CC2 /* BoundedHTTPDataTransportTests.swift */; }; + D698B39BD305EC2E4168B923 /* TrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4A370EA2BA551D5351835E6 /* TrafficSource.swift */; }; + D6DB988F5D1D2A3C2A5753E5 /* IPCProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */; }; + D73CBA15CD6E91DE465C0556 /* DesignTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF0C2E06D541DAEC1BC5F33 /* DesignTokens.swift */; }; + D77B6BB95661074A90B12EE7 /* NettopParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497DF4817317CE033F2A83A2 /* NettopParser.swift */; }; + D9987CC20EB70831208A0430 /* OnDeviceAsk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EEDBAB278885D747B420AD3 /* OnDeviceAsk.swift */; }; + DB09CEC00A661AF26C37244E /* DestinationProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62A00EA0C0D8B7844E6F7B2 /* DestinationProfile.swift */; }; + DB969099AF17B4E0DBA3034C /* UpdateInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 121FF2EBC93394E8EDCFF0BF /* UpdateInstaller.swift */; }; + DBC04B2A1B129C44A3D8A40D /* ProcessNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F3F458498856491A40E88C /* ProcessNaming.swift */; }; + DC7F897C9C4E1E353F05E3A5 /* PluginSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ACC341615D95ADA623BBEC /* PluginSettingsView.swift */; }; + DC86A6B4919CF1B6D72662FE /* InspectionBudgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F07BDE0C2D8005899C1AF21C /* InspectionBudgetView.swift */; }; + DDC032E6272181F3E1B1BB4F /* ReportsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCD98C0A49FC6C5521129087 /* ReportsView.swift */; }; + DDE2B0B0A807C428B9F78120 /* AgentCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */; }; + DE40C611330AC62B7A53B63C /* AgentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81434EE3C45929E8A768D42E /* AgentsView.swift */; }; + DE472CC9E3475EF582BB706E /* DemoDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E83A96A61DE59D2731045A8C /* DemoDataTests.swift */; }; + DED507EF1A36E9B66FE4512E /* HTTPStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8974956FEBD82934CA1EB5 /* HTTPStream.swift */; }; + DEDCFC43A3BBD2E91277302F /* PluginScriptRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = E593C4ED11E1BCADD22099E6 /* PluginScriptRunner.swift */; }; + DF8776D774DE087DBBFB257F /* TrafficDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94538A9E26BCD8960123C7E4 /* TrafficDatabase.swift */; }; + DFC721C64B216FEB81C55917 /* UpdateChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C9C36E21D6DB161C80DF3F6 /* UpdateChecker.swift */; }; + E00C03B4955BFBA626340B5C /* InspectMenuItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = 406DB466CD32DA8223AE61A6 /* InspectMenuItems.swift */; }; + E09B5E0093DE7BABBC1561DA /* ExtensionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53217054F0EFD8EC322BC5B1 /* ExtensionManager.swift */; }; + E0C3CC3AA91B74C0D98ACE5F /* RulePackSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */; }; + E12E137A657C739019D6F4D3 /* RewriteRule.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA3B4EB0E0D40E39CE24E1B /* RewriteRule.swift */; }; + E15272D4731FBF6CB1126495 /* JSONTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23CAA36BFFADC83D65DBF0FE /* JSONTreeView.swift */; }; + E16E772F86A6469231B18EB2 /* RulePackCatalogUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738E050AC8811051BF14E529 /* RulePackCatalogUpdater.swift */; }; + E25A53EA4362FCC71BCE5A80 /* ExportModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF216452A0F90D9E90A6BD34 /* ExportModels.swift */; }; + E384EA8E1EEBA1689E638B8C /* official-rule-packs-v1-public.pem in Resources */ = {isa = PBXBuildFile; fileRef = 1F49F6CFAF06DFBB9416246D /* official-rule-packs-v1-public.pem */; }; + E3C7DC93B1AC66ECA40B7820 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92FDE4C87CC59491B70BF3F3 /* ContentView.swift */; }; + E3F2CFD47F40B6A9481C5777 /* PluginTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D460484C8D6DFA5D495132 /* PluginTests.swift */; }; + E4D30933B930F00B7CAADE20 /* MCPDomainsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1888DEE22E9C2FCFB5DC064 /* MCPDomainsSection.swift */; }; + E592D3A1D73A580676FA5696 /* InspectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE93ABADFF46C961FCABAB8 /* InspectView.swift */; }; + E5973D84F73F277220538694 /* RulePackCatalogComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = E858E52F162361C6FD039F16 /* RulePackCatalogComposition.swift */; }; + E62BAD317B20BE6E16A21FA3 /* IPCServer.txt in Resources */ = {isa = PBXBuildFile; fileRef = 76B6293D3AAFF511F855C4E6 /* IPCServer.txt */; }; + E69786240DE2CC058F7A307A /* ResponseScriptRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D6646248D4CDF3EB86A893 /* ResponseScriptRunner.swift */; }; + E6B53114FFB3F672BA02FE69 /* LLMFacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95765A2F0D026D17736C9D9D /* LLMFacts.swift */; }; + E6D43A9CA39D3D205D2FD8EC /* TrafficTreePagingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158356080B1479D37407B9F7 /* TrafficTreePagingTests.swift */; }; + E7F844DADB9BBF4F5A2024B6 /* InspectionProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD96902AACB4B557DEFFBCD /* InspectionProxy.swift */; }; + E844FB53C6EA5C8BF5F37849 /* NettopTrafficSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957EEA0C3C7342504E533506 /* NettopTrafficSource.swift */; }; + E88DD26D7D2E9C0E0FBACD6F /* ProtocolClassifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */; }; + E8F73E4CF1E8701968CB2E96 /* AppLifecycleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D73C529EED550F2BD81CB72 /* AppLifecycleTests.swift */; }; + EA2D23AFA530F762A6901E08 /* AgentWorkspaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B484EC45F6D3CF2D66D12BE0 /* AgentWorkspaceTests.swift */; }; + EA679C463EB3158EA7195052 /* Coverage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC52100D779B101B1B2595F /* Coverage.swift */; }; + EA73DD364261DB7A3860FCF1 /* AppleSystemApps.swift in Sources */ = {isa = PBXBuildFile; fileRef = D16976C5552006B1F9975A62 /* AppleSystemApps.swift */; }; + EAA7D632ABC5F2450CDDB68E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB82D0B63E8C783DD0A4FB5 /* main.swift */; }; + EB842377A7936B0BC9AAEC71 /* BehaviourPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB40E7DB142C886F94FE2448 /* BehaviourPanel.swift */; }; + ECE292CA7FBB8A6CE372B4F5 /* RulePackTransfer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */; }; + ED1CF3BBC1C4D317658D07A0 /* ProxyRelaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13D29667127E5DE57908D936 /* ProxyRelaunchTests.swift */; }; + ED2148A66082B969315461CA /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = F186517132592B36ED2B9F80 /* main.swift */; }; + EDAB8186A2117A6EE711A8B9 /* RulePackStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02B5736850B28B462739C2CD /* RulePackStore.swift */; }; + EDB017EC114FFAF18CEC2786 /* PacketSniffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F062E6D35F98D8EEF1EBE47C /* PacketSniffer.swift */; }; + EDEAECD3FA4B513114C0B581 /* CodeSignatureCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 168D824382963305ED7E6C04 /* CodeSignatureCheck.swift */; }; + EE32964EF451CD9211A37D6A /* ProcessResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F2F1F8536857610FB4C9854 /* ProcessResolver.swift */; }; + EEA0FEAC3D3CA9C73393EF3E /* AskEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7611E8788B3B6AF18F1CEDF7 /* AskEnvironment.swift */; }; + EF0EBBEAC6177681CBD4F0D7 /* GlobMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */; }; + EF23A175A11656427632BE45 /* AskProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = D59A773537F63761107681A3 /* AskProvider.swift */; }; + EF4CBFD483B59B62F3432F3E /* NetworkScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */; }; + EF8276E6A9A832CB5D74AFE3 /* ExportSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B82FFB06C5A1C98D5E4D7D1 /* ExportSettingsView.swift */; }; + EF884A8D586CA5022C4DD01B /* SystemExtensionScan.swift in Sources */ = {isa = PBXBuildFile; fileRef = A617D9483BCC31A0F4200A90 /* SystemExtensionScan.swift */; }; + EFBA053570FE24748547DDB2 /* TrafficDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94538A9E26BCD8960123C7E4 /* TrafficDatabase.swift */; }; + F130AF6A964F77EF85EBB32D /* RuleTemplates.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD00CA1EF2A7DA909E3A31B5 /* RuleTemplates.swift */; }; + F1ACC6A35E482FC31C0EA0B1 /* InstalledAppsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D752E3A8C7633C8BC939BE /* InstalledAppsTests.swift */; }; + F205410D7C07CB367224D44F /* ExportSecrets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AE72E8F916C18A468E968A /* ExportSecrets.swift */; }; + F2304F128BB915C60307AD44 /* BlockEnforcer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6FB03454241CB84A9AA13 /* BlockEnforcer.swift */; }; + F26718FE423FEE15B5502B8A /* Rule.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BAF46D43D2171398478FC3 /* Rule.swift */; }; + F454E718DC7E6F7BDA3ECA61 /* RuleSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */; }; + F47E13AFAFF872BB15EA4E59 /* AskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41AE1A6CC673544FCEC9E7F4 /* AskView.swift */; }; + F5AE32D382E6DDD1B06783B8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4849A413C60A9ABC4F9C16E /* SettingsView.swift */; }; + F5F925E03C86F8B023DC788D /* ExtensionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53217054F0EFD8EC322BC5B1 /* ExtensionManager.swift */; }; + F75EB274ED11E8E4225746B2 /* ReportsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCD98C0A49FC6C5521129087 /* ReportsView.swift */; }; + F782A1187A8564DA1C37EDC1 /* DevicesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2FBA5700CA1489D6740FC8 /* DevicesView.swift */; }; + F7D8E5F618EF5B76959097BF /* InspectionBudgetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E4DFA9032765BBB7E75706F /* InspectionBudgetTests.swift */; }; + F842F0968BAFF7623B4A86BE /* RulePack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10036A17CDFCA45E068708EE /* RulePack.swift */; }; + F8E48AAE0CDB4DD16025AAEE /* IPOwnerLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6B4B0B76D53D8089C95762F /* IPOwnerLookup.swift */; }; + F9429DCDFAEE199D6635BA33 /* LocalRiskAnalysis.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93E71941B27710D83594A6C5 /* LocalRiskAnalysis.swift */; }; + FACBCE71B0804DB4187D132B /* AnswerTextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15380DABDCB2492A132A90E4 /* AnswerTextTests.swift */; }; + FB53CA12F4EA8442D4E773E4 /* IPCServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC8A0C2D83843716604FD3F0 /* IPCServer.swift */; }; + FBE542C1BDCE771392543BD1 /* AppNavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0158F10AEABEF28A925E8C3 /* AppNavigation.swift */; }; + FC820F255E16C392B007726B /* RuleSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */; }; + FCD81B854E4C12AA3BE84A4D /* SettingsEnforcerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E1E1E6E8B1C2130BD563759 /* SettingsEnforcerTests.swift */; }; + FD08E709481530B77F4ED795 /* HelpTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351C523438EA0A811504B57C /* HelpTests.swift */; }; + FE234FA5F34AAB7B7074BDB9 /* InspectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70F169CF4776BE3FAF69AE73 /* InspectionTests.swift */; }; + FE3B0FCAFA812B5CEA810488 /* InspectionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCB2008E4820D1DE1DE154F /* InspectionRecorder.swift */; }; + FECA6CBE50938E777E17D87D /* HTTPHostParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */; }; + FEE9F18D463C7060E835F757 /* RulePackSimulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */; }; + FF3F2EE3FE29F6827D527B31 /* AgentLauncherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD30777A046F705110A99269 /* AgentLauncherTests.swift */; }; + FF4E47F54DE6A3BCFFEBAA01 /* LocalRiskSettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 662F0B94BED1CA47AD516AC9 /* LocalRiskSettingsSection.swift */; }; + FF4E8EC8F36613C1C03549AE /* PluginPackageVerifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C96560CB05BDDBB136E34B /* PluginPackageVerifier.swift */; }; + FF59AD47E15AFE192913C918 /* RewriteRulesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44CCD94E9D554D6DD61486FF /* RewriteRulesView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7C42FA3A564662B5DB0FD5BF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27052BCDFA1783A148CD45FD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C9BF0C33D1912981FB4B5AD; + remoteInfo = Flowlight; + }; + 8E69049BBCF586A050AA927F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27052BCDFA1783A148CD45FD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 36B21D467163CD9F57115778; + remoteInfo = FlowlightResponseScriptHelper; + }; + 8F920FDBFA157B736CCD7ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27052BCDFA1783A148CD45FD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 94D00543044D9B601CDCA877; + remoteInfo = FlowlightExtension; + }; + A212C96A4D9348FC9F87A9EA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 27052BCDFA1783A148CD45FD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 904DAC0BB81071A09FF1A5B0; + remoteInfo = FlowlightStoreExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 32FF3A971C555C5CD158F63B /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 6034C069D97EE923799AC9B2 /* FlowlightStoreExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 645C1B96C25EC035E5415BD4 /* Embed Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ../Library/Helpers; + dstSubfolderSpec = 6; + files = ( + C07CFCE9876D9F55F8BA9C25 /* FlowlightResponseScriptHelper in Embed Dependencies */, + ); + name = "Embed Dependencies"; + runOnlyForDeploymentPostprocessing = 0; + }; + BD32BB41996D3CEEDBC8D17E /* Embed Dependencies */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ../Library/SystemExtensions; + dstSubfolderSpec = 13; + files = ( + 157717AA8B338201B7C3B4C7 /* FlowlightExtension.systemextension in Embed Dependencies */, + ); + name = "Embed Dependencies"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 02ACC341615D95ADA623BBEC /* PluginSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginSettingsView.swift; sourceTree = ""; }; + 02B5736850B28B462739C2CD /* RulePackStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackStore.swift; sourceTree = ""; }; + 02EE3A99F49A058BF061C147 /* MCPAttributionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCPAttributionTests.swift; sourceTree = ""; }; + 0599916780428125A134B249 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 06816A9441C5EFEF5EF55CA5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 077EA8EE506D61EC90E4411E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; + 07F902D9D498F399BBDD85E0 /* PluginModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginModels.swift; sourceTree = ""; }; + 082111849A66652DD9F1BE01 /* AgentsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentsModel.swift; sourceTree = ""; }; + 08643257F8D11784563BD6CC /* RuleEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleEditor.swift; sourceTree = ""; }; + 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobMatch.swift; sourceTree = ""; }; + 089476A21B8A6AE7F3F4A53A /* RulePackEditorDraft.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackEditorDraft.swift; sourceTree = ""; }; + 08A401B3A5D8ED9031EAAF03 /* GuardrailTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuardrailTests.swift; sourceTree = ""; }; + 08C5F9CC0D644DCA03F5F4C5 /* RulePackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackTests.swift; sourceTree = ""; }; + 09E79F3A686C0EC5D7B28E8C /* AgentWorkspace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentWorkspace.swift; sourceTree = ""; }; + 0A12EC605B35B8042A369205 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 0ADADFFC230017F80D707ECE /* ResponseTransformTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseTransformTests.swift; sourceTree = ""; }; + 0CBBF571DC526F85E7232F79 /* FlowlightTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FlowlightTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0F2F1F8536857610FB4C9854 /* ProcessResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessResolver.swift; sourceTree = ""; }; + 10036A17CDFCA45E068708EE /* RulePack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePack.swift; sourceTree = ""; }; + 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackSimulation.swift; sourceTree = ""; }; + 11A65C830B699BC4477CA879 /* Guardrail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Guardrail.swift; sourceTree = ""; }; + 1218F146542CC01A417469F9 /* ExtensionRecovery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionRecovery.swift; sourceTree = ""; }; + 121FF2EBC93394E8EDCFF0BF /* UpdateInstaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateInstaller.swift; sourceTree = ""; }; + 13D29667127E5DE57908D936 /* ProxyRelaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyRelaunchTests.swift; sourceTree = ""; }; + 14C234AF77E7451A1505DDF9 /* AskChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskChart.swift; sourceTree = ""; }; + 15380DABDCB2492A132A90E4 /* AnswerTextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnswerTextTests.swift; sourceTree = ""; }; + 15456E37F11CE5E19A124753 /* GuardrailEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuardrailEngine.swift; sourceTree = ""; }; + 158356080B1479D37407B9F7 /* TrafficTreePagingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficTreePagingTests.swift; sourceTree = ""; }; + 15AF59D58B332F548630D949 /* ParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParserTests.swift; sourceTree = ""; }; + 15E51941A085C6B16AF395BB /* InspectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionController.swift; sourceTree = ""; }; + 168D824382963305ED7E6C04 /* CodeSignatureCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodeSignatureCheck.swift; sourceTree = ""; }; + 1B2E7474FB6A7B8B56B98917 /* ToolActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolActivity.swift; sourceTree = ""; }; + 1B2EB4E838E550B396BDB883 /* ExtensionSourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionSourceTests.swift; sourceTree = ""; }; + 1C63D0070EAC9A8146D63ABD /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; + 1D0AA61D989998AB7A90CDDB /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; + 1F49F6CFAF06DFBB9416246D /* official-rule-packs-v1-public.pem */ = {isa = PBXFileReference; path = "official-rule-packs-v1-public.pem"; sourceTree = ""; }; + 1FD96902AACB4B557DEFFBCD /* InspectionProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionProxy.swift; sourceTree = ""; }; + 20C95610696E32B96E500E8F /* bpf-access.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "bpf-access.sh"; sourceTree = ""; }; + 20CA8150CA012929A40558FB /* BPFProgram.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BPFProgram.swift; sourceTree = ""; }; + 21A2E14BFE5E66664D0A604B /* AnomalyEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnomalyEngine.swift; sourceTree = ""; }; + 21FEECAD5C958CF49A659E14 /* UpdateVerificationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateVerificationTests.swift; sourceTree = ""; }; + 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPHostParser.swift; sourceTree = ""; }; + 22C46B9250A6ADDFD915500B /* DestinationProfileTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DestinationProfileTests.swift; sourceTree = ""; }; + 22D460484C8D6DFA5D495132 /* PluginTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginTests.swift; sourceTree = ""; }; + 23CAA36BFFADC83D65DBF0FE /* JSONTreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONTreeView.swift; sourceTree = ""; }; + 254FA06DF59A8410C9BAE161 /* RuleTemplateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleTemplateTests.swift; sourceTree = ""; }; + 2747CAE7AD41663488F0E2B9 /* ExtensionRecoveryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionRecoveryTests.swift; sourceTree = ""; }; + 2B82FFB06C5A1C98D5E4D7D1 /* ExportSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportSettingsView.swift; sourceTree = ""; }; + 2B95789E8FFF77D3182BADCF /* BodySearchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BodySearchTests.swift; sourceTree = ""; }; + 2CC957336FC5BD77D7A81651 /* Focus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Focus.swift; sourceTree = ""; }; + 2CFC920FE55E719B46039E1F /* FlowJudgementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowJudgementTests.swift; sourceTree = ""; }; + 2D1D13FDE75AF5064805D258 /* Notifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifier.swift; sourceTree = ""; }; + 2D6CCA395BF33CDF9F92B725 /* MCPDomains.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCPDomains.swift; sourceTree = ""; }; + 2E1E1E6E8B1C2130BD563759 /* SettingsEnforcerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEnforcerTests.swift; sourceTree = ""; }; + 2E35905A6578A1204796962E /* MockResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockResponseTests.swift; sourceTree = ""; }; + 2E4DFA9032765BBB7E75706F /* InspectionBudgetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionBudgetTests.swift; sourceTree = ""; }; + 33480D5241332B3AA21CBE49 /* Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localization.swift; sourceTree = ""; }; + 34AD2BFFA35727FB39287960 /* MCPDomainsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCPDomainsTests.swift; sourceTree = ""; }; + 351C523438EA0A811504B57C /* HelpTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelpTests.swift; sourceTree = ""; }; + 37AE72E8F916C18A468E968A /* ExportSecrets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportSecrets.swift; sourceTree = ""; }; + 37FE9D6F8BA82F3C266E147A /* MCPAttribution.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCPAttribution.swift; sourceTree = ""; }; + 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 3B07796D1108F037FF196443 /* AgentPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentPolicyTests.swift; sourceTree = ""; }; + 3B2FA5540C38FA293E3EB457 /* TrafficTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficTree.swift; sourceTree = ""; }; + 3C1CF4C48AA260D71155C022 /* Components.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Components.swift; sourceTree = ""; }; + 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolClassifier.swift; sourceTree = ""; }; + 3C8267406A5D7DA536B7A713 /* FlowTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowTracker.swift; sourceTree = ""; }; + 3D61C3343882268C81871C9B /* DNSParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSParser.swift; sourceTree = ""; }; + 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostCanonicalizer.swift; sourceTree = ""; }; + 3FD3230056607B454EAC381D /* ExportPayload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportPayload.swift; sourceTree = ""; }; + 3FD4661C1ABB39E65894AE7F /* CaptureAccess.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureAccess.swift; sourceTree = ""; }; + 4017B3BE9E7FC6895D23FB6C /* Flowlight-AppStore.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Flowlight-AppStore.entitlements"; sourceTree = ""; }; + 406DB466CD32DA8223AE61A6 /* InspectMenuItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectMenuItems.swift; sourceTree = ""; }; + 415931FB0EB29261A56B90C7 /* AskQuery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskQuery.swift; sourceTree = ""; }; + 41AE1A6CC673544FCEC9E7F4 /* AskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskView.swift; sourceTree = ""; }; + 41B98E13F994F7E684F57C07 /* AgentAttributor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentAttributor.swift; sourceTree = ""; }; + 440DB80190A1847AC834210D /* AgentLauncher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentLauncher.swift; sourceTree = ""; }; + 44CCD94E9D554D6DD61486FF /* RewriteRulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewriteRulesView.swift; sourceTree = ""; }; + 45076E14820DDD4CFF352226 /* ProxyJanitorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyJanitorTests.swift; sourceTree = ""; }; + 461E9D1F76A4F9505335AB87 /* LocalRiskViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalRiskViews.swift; sourceTree = ""; }; + 48B24C254E2C17056730C06B /* RulePackDeliveryStats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackDeliveryStats.swift; sourceTree = ""; }; + 497DF4817317CE033F2A83A2 /* NettopParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NettopParser.swift; sourceTree = ""; }; + 4D2C6211A645D4DDF8526DF2 /* ExportController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportController.swift; sourceTree = ""; }; + 4D73C529EED550F2BD81CB72 /* AppLifecycleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLifecycleTests.swift; sourceTree = ""; }; + 4D9926D17DD57B7F97E895C9 /* JSONValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONValue.swift; sourceTree = ""; }; + 4EEDBAB278885D747B420AD3 /* OnDeviceAsk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnDeviceAsk.swift; sourceTree = ""; }; + 4F2FBA5700CA1489D6740FC8 /* DevicesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DevicesView.swift; sourceTree = ""; }; + 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkScope.swift; sourceTree = ""; }; + 50FB4666B2D07DDE032C87EC /* FocusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusTests.swift; sourceTree = ""; }; + 53217054F0EFD8EC322BC5B1 /* ExtensionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionManager.swift; sourceTree = ""; }; + 594F3762D9AD6347C83BA710 /* DemoData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoData.swift; sourceTree = ""; }; + 59A21E183B79E3C66146070D /* NetworkChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkChannel.swift; sourceTree = ""; }; + 59B40E5AD74F74A029AD46E4 /* RulePackCatalogTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogTests.swift; sourceTree = ""; }; + 5B9F2521A73E6E3264F557E6 /* CaptureView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureView.swift; sourceTree = ""; }; + 5BC2D26D49B4E14A148BE9C6 /* InspectScopeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectScopeTests.swift; sourceTree = ""; }; + 5C0F9AC24A75E20F3FA0B2BB /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = ""; }; + 5C34C9D0A9B302B4CF4C7125 /* HTTPDataTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPDataTransport.swift; sourceTree = ""; }; + 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleSimulation.swift; sourceTree = ""; }; + 6053ADC7641DB8CAEA9390D6 /* FlowlightAppStore.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlowlightAppStore.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficModels.swift; sourceTree = ""; }; + 61080233ED162067497EE2E3 /* FocusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusView.swift; sourceTree = ""; }; + 615E4FAE5D0865FB1E2492E8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 61823557D86136986EEE4A18 /* CaptureWarning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureWarning.swift; sourceTree = ""; }; + 61D6646248D4CDF3EB86A893 /* ResponseScriptRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseScriptRunner.swift; sourceTree = ""; }; + 62444723DE772055CA79A923 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 638E7A9BEB644503868C49E9 /* DeviceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTests.swift; sourceTree = ""; }; + 64FEF0DA4ACD3157DA6FA4B3 /* LocalRiskAnalysisTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalRiskAnalysisTests.swift; sourceTree = ""; }; + 662F0B94BED1CA47AD516AC9 /* LocalRiskSettingsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalRiskSettingsSection.swift; sourceTree = ""; }; + 6652559787FD52622A19834A /* CertificateAuthority.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CertificateAuthority.swift; sourceTree = ""; }; + 67763C99431F26FE1D428EA2 /* AskController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskController.swift; sourceTree = ""; }; + 694D30A62FAF11702B7EF605 /* RewriteRuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewriteRuleTests.swift; sourceTree = ""; }; + 6AF0ACB7FCA10D7758DE177D /* InspectionBudget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionBudget.swift; sourceTree = ""; }; + 6E8974956FEBD82934CA1EB5 /* HTTPStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPStream.swift; sourceTree = ""; }; + 6F9EEC138B6EE3479F9F10E0 /* Flowlight.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flowlight.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 7075FF219DB5D21F32149FE5 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + 70965BF26E0B4B3F9719122B /* WindowVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowVisibilityTests.swift; sourceTree = ""; }; + 70F169CF4776BE3FAF69AE73 /* InspectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionTests.swift; sourceTree = ""; }; + 719C08673D2446F21DAF9F54 /* ExportQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportQueue.swift; sourceTree = ""; }; + 738E050AC8811051BF14E529 /* RulePackCatalogUpdater.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogUpdater.swift; sourceTree = ""; }; + 74F1DEAAAAAA607CEA5EC303 /* OnDeviceRiskProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnDeviceRiskProvider.swift; sourceTree = ""; }; + 7611E8788B3B6AF18F1CEDF7 /* AskEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskEnvironment.swift; sourceTree = ""; }; + 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtocolCatalog.swift; sourceTree = ""; }; + 76B6293D3AAFF511F855C4E6 /* IPCServer.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = IPCServer.txt; sourceTree = ""; }; + 76D752E3A8C7633C8BC939BE /* InstalledAppsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledAppsTests.swift; sourceTree = ""; }; + 78D5C4691F1B4DFDDCC1A705 /* BoundedHTTPDataTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoundedHTTPDataTransport.swift; sourceTree = ""; }; + 7BA6FB03454241CB84A9AA13 /* BlockEnforcer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockEnforcer.swift; sourceTree = ""; }; + 7EEA2706008C57CB75FB17CD /* RuleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleTests.swift; sourceTree = ""; }; + 7FA151AA64480DAACC602123 /* InsightsPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsightsPanel.swift; sourceTree = ""; }; + 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockRules.swift; sourceTree = ""; }; + 810530D0FFDE61BE5CDB4CC2 /* BoundedHTTPDataTransportTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoundedHTTPDataTransportTests.swift; sourceTree = ""; }; + 81434EE3C45929E8A768D42E /* AgentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentsView.swift; sourceTree = ""; }; + 81F190466C9691ADAF7BC8DA /* SystemExtensions.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemExtensions.framework; path = System/Library/Frameworks/SystemExtensions.framework; sourceTree = SDKROOT; }; + 82D568056D9E6FACAC42D563 /* FeatureGuide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureGuide.swift; sourceTree = ""; }; + 8507D8801643823A18134BF8 /* RulePackCatalogUpdaterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogUpdaterTests.swift; sourceTree = ""; }; + 88962BAF6E215B83FE0AFF9A /* RulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulesView.swift; sourceTree = ""; }; + 89C74F92FC42AE36F5D97F1F /* EnrichmentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnrichmentTests.swift; sourceTree = ""; }; + 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; + 8CB82D0B63E8C783DD0A4FB5 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 8E01AEB9AB4F8723FFFA4BFB /* ExportTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportTests.swift; sourceTree = ""; }; + 8EF576B7B41898D84B4E487F /* Info-AppStore.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Info-AppStore.plist"; sourceTree = ""; }; + 8F08D1913575FFC1F548CAB5 /* GuardrailsPane.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuardrailsPane.swift; sourceTree = ""; }; + 91657F4898EFEBCB551ADD4E /* RemoteAsk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteAsk.swift; sourceTree = ""; }; + 92BAF46D43D2171398478FC3 /* Rule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rule.swift; sourceTree = ""; }; + 92FDE4C87CC59491B70BF3F3 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 9341EDA5AB3454E82FECD53A /* FlowlightStoreExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = FlowlightStoreExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 93E71941B27710D83594A6C5 /* LocalRiskAnalysis.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalRiskAnalysis.swift; sourceTree = ""; }; + 94004173EC96619B41EDF49F /* AskFeatureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskFeatureTests.swift; sourceTree = ""; }; + 94538A9E26BCD8960123C7E4 /* TrafficDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficDatabase.swift; sourceTree = ""; }; + 94F3F458498856491A40E88C /* ProcessNaming.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessNaming.swift; sourceTree = ""; }; + 95761708CD76CABDF0696BCE /* ExtensionTrafficSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionTrafficSource.swift; sourceTree = ""; }; + 95765A2F0D026D17736C9D9D /* LLMFacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LLMFacts.swift; sourceTree = ""; }; + 957EEA0C3C7342504E533506 /* NettopTrafficSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NettopTrafficSource.swift; sourceTree = ""; }; + 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPCProtocol.swift; sourceTree = ""; }; + 97943E847A22CF491FA82084 /* RuleStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleStore.swift; sourceTree = ""; }; + 98FE7804F3D1F6A247F0C8DF /* ToolCallLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolCallLinks.swift; sourceTree = ""; }; + 992F80EF7B17CA25C7D83AC8 /* Motion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Motion.swift; sourceTree = ""; }; + 9970A61AD194525C58096029 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 9B910FBB81CDAC17AE5ACCEA /* RuleSimulationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleSimulationView.swift; sourceTree = ""; }; + 9C0843B4BD70F8F83167F2D3 /* InsightsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsightsModel.swift; sourceTree = ""; }; + 9C9C36E21D6DB161C80DF3F6 /* UpdateChecker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateChecker.swift; sourceTree = ""; }; + 9CC12B7176A61DD80F12043A /* RulePacksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePacksView.swift; sourceTree = ""; }; + 9D6A2870B379B2C1C171C7A3 /* DatabaseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseTests.swift; sourceTree = ""; }; + 9D9FCA36BD4A101EA1F02DFF /* SQLite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SQLite.swift; sourceTree = ""; }; + 9DA4611687EF2F8AADA58A49 /* AppRestart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRestart.swift; sourceTree = ""; }; + 9EC52100D779B101B1B2595F /* Coverage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coverage.swift; sourceTree = ""; }; + 9EF395A2F3D6C97FF9EC53E4 /* index.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; + 9FFEA980768CD488D58CC0B1 /* DemoInspection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoInspection.swift; sourceTree = ""; }; + A0A1C1F3361CA62C0D08C168 /* PluginEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginEngine.swift; sourceTree = ""; }; + A15168A448857A6CC759F7BB /* RulePackEventDelivery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackEventDelivery.swift; sourceTree = ""; }; + A2A5AC7D1719857AE8ED1CFA /* InsightsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsightsTests.swift; sourceTree = ""; }; + A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackTransfer.swift; sourceTree = ""; }; + A55A095537DB24454B007D1B /* PluginStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginStore.swift; sourceTree = ""; }; + A5A9D356FF073F1DA1C05522 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + A617D9483BCC31A0F4200A90 /* SystemExtensionScan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemExtensionScan.swift; sourceTree = ""; }; + A62A00EA0C0D8B7844E6F7B2 /* DestinationProfile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DestinationProfile.swift; sourceTree = ""; }; + A7BDAE5D54ABFD08CCFFE447 /* ProxyRelaunch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyRelaunch.swift; sourceTree = ""; }; + A903BAF9BBDCFEAEC2F023FF /* USBMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = USBMonitor.swift; sourceTree = ""; }; + A95B12B83D0B4346AF52BDA6 /* FlowlightExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FlowlightExtension.entitlements; sourceTree = ""; }; + AA72D307E4B1A08BE4B8AEF8 /* ExportDisclosureSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportDisclosureSheet.swift; sourceTree = ""; }; + AA9340FE2B6C417D1A19AF54 /* ResponseGate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseGate.swift; sourceTree = ""; }; + AAD9DD248FDC1D5D58EFC726 /* RuleSimulationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleSimulationTests.swift; sourceTree = ""; }; + AB0C0840C443F8AEDD254AE0 /* RulePackEventDeliveryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackEventDeliveryTests.swift; sourceTree = ""; }; + ABD4C8B6E3620F5E46C69434 /* BuiltInRulePacks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuiltInRulePacks.swift; sourceTree = ""; }; + AC02CB8000B00C4C0AD84E60 /* SharedStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharedStrings.swift; sourceTree = ""; }; + AC8A0C2D83843716604FD3F0 /* IPCServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPCServer.swift; sourceTree = ""; }; + ADD9D2D024F76347C8414BD5 /* NetworkChannelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkChannelTests.swift; sourceTree = ""; }; + ADDB360F7DA88D34505F4D8A /* official.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = official.json; sourceTree = ""; }; + AE2A4754CFE5FD187CAF66AD /* ExportVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportVisibilityTests.swift; sourceTree = ""; }; + AEB593C0CD03CAA473F143ED /* Flowlight.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Flowlight.entitlements; sourceTree = ""; }; + AF8F5D7CBCD592768D4C3F2E /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; + AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentPolicy.swift; sourceTree = ""; }; + AFA3B4EB0E0D40E39CE24E1B /* RewriteRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewriteRule.swift; sourceTree = ""; }; + AFAEE09994253E82748BCCCB /* LLMToolCalls.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LLMToolCalls.swift; sourceTree = ""; }; + B0158F10AEABEF28A925E8C3 /* AppNavigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppNavigation.swift; sourceTree = ""; }; + B1888DEE22E9C2FCFB5DC064 /* MCPDomainsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MCPDomainsSection.swift; sourceTree = ""; }; + B1C69EEECAA62FC98DBC8CB2 /* CoverageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverageView.swift; sourceTree = ""; }; + B3244269609CC161996866B5 /* FlowlightApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowlightApp.swift; sourceTree = ""; }; + B4849A413C60A9ABC4F9C16E /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + B484EC45F6D3CF2D66D12BE0 /* AgentWorkspaceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentWorkspaceTests.swift; sourceTree = ""; }; + B545B09C3EE58C355E7D048A /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TLSSNIParser.swift; sourceTree = ""; }; + B9B6A48D086EF16CF6E438FF /* BluetoothMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BluetoothMonitor.swift; sourceTree = ""; }; + BB40E7DB142C886F94FE2448 /* BehaviourPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BehaviourPanel.swift; sourceTree = ""; }; + BD0D85E63A3FEC65FE1FD068 /* FlowlightResponseScriptHelper */ = {isa = PBXFileReference; includeInIndex = 0; path = FlowlightResponseScriptHelper; sourceTree = BUILT_PRODUCTS_DIR; }; + BF216452A0F90D9E90A6BD34 /* ExportModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportModels.swift; sourceTree = ""; }; + BFE93ABADFF46C961FCABAB8 /* InspectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectView.swift; sourceTree = ""; }; + C087727B358A400DCFD7E0E6 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + C18286421CD591157CF1E1FD /* ProxyJanitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProxyJanitor.swift; sourceTree = ""; }; + C35EF76A8728F308E2D6973A /* RulePackCatalogVerifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogVerifier.swift; sourceTree = ""; }; + C3E4E7F1E8B83D086AF0CB1B /* InspectNavigationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectNavigationTests.swift; sourceTree = ""; }; + C4A370EA2BA551D5351835E6 /* TrafficSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficSource.swift; sourceTree = ""; }; + C8251DBDC21C44CB92CC1C67 /* SettingsEnforcer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsEnforcer.swift; sourceTree = ""; }; + CAC8A1658834152DBFBA4494 /* MockGate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockGate.swift; sourceTree = ""; }; + CB1C1786F72F8D0BC95B9BAC /* RulePackCatalogPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogPersistenceTests.swift; sourceTree = ""; }; + CB78709D1E01638E63A484D3 /* AskTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskTests.swift; sourceTree = ""; }; + CCA8D35E21C4BC1F15368DE3 /* TrafficMonitorRulePackStartupTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficMonitorRulePackStartupTests.swift; sourceTree = ""; }; + CD774DADE526BE4F507BE06C /* DeviceModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceModels.swift; sourceTree = ""; }; + CF28074238079D33EFB6B862 /* AppleSystemAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleSystemAppTests.swift; sourceTree = ""; }; + CF2DEA93C3D6844E3345D2D8 /* ExportDisclosure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportDisclosure.swift; sourceTree = ""; }; + CFC1036E5ABBFDB8740405F3 /* DeviceStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceStore.swift; sourceTree = ""; }; + D16976C5552006B1F9975A62 /* AppleSystemApps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleSystemApps.swift; sourceTree = ""; }; + D1C046DCF0CB1227CA93DA24 /* FlowlightExtension.systemextension */ = {isa = PBXFileReference; explicitFileType = "wrapper.system-extension"; includeInIndex = 0; path = FlowlightExtension.systemextension; sourceTree = BUILT_PRODUCTS_DIR; }; + D210A86033CB79C792000CA2 /* UpdateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateView.swift; sourceTree = ""; }; + D2DD7D42B7798A6C57F8C49E /* SystemExtensionScanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemExtensionScanTests.swift; sourceTree = ""; }; + D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentCatalog.swift; sourceTree = ""; }; + D59A773537F63761107681A3 /* AskProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskProvider.swift; sourceTree = ""; }; + D7DE406298624DC5F3A82A22 /* FlowlightExtension-AppStore.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FlowlightExtension-AppStore.entitlements"; sourceTree = ""; }; + D9195A6149AE1C6628A3E184 /* GuardrailStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuardrailStore.swift; sourceTree = ""; }; + DB223BC3AD00430A5673C439 /* ResponseTransformRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseTransformRule.swift; sourceTree = ""; }; + DBC0A436E879000F8F5FF9E7 /* TrafficMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrafficMonitor.swift; sourceTree = ""; }; + DC8F91DE12A1C58BB2BD7038 /* AgentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentTests.swift; sourceTree = ""; }; + DCCB2008E4820D1DE1DE154F /* InspectionRecorder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionRecorder.swift; sourceTree = ""; }; + DCF7C56CAF72886BEB812F8F /* ExportDisclosureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportDisclosureTests.swift; sourceTree = ""; }; + DD30777A046F705110A99269 /* AgentLauncherTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgentLauncherTests.swift; sourceTree = ""; }; + DD71004CFB571B9167866770 /* AskQueryRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AskQueryRunner.swift; sourceTree = ""; }; + E45902808344F173033EB0F5 /* WindowVisibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowVisibility.swift; sourceTree = ""; }; + E489125D1DBF3EF98AEED4EB /* ProcessLookup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProcessLookup.swift; sourceTree = ""; }; + E593C4ED11E1BCADD22099E6 /* PluginScriptRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginScriptRunner.swift; sourceTree = ""; }; + E6A7703953570391821257DD /* ToolResults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolResults.swift; sourceTree = ""; }; + E7FBB33595155CF835AF14D5 /* MockRule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRule.swift; sourceTree = ""; }; + E83A96A61DE59D2731045A8C /* DemoDataTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoDataTests.swift; sourceTree = ""; }; + E858E52F162361C6FD039F16 /* RulePackCatalogComposition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogComposition.swift; sourceTree = ""; }; + E872723F2D92AA78F7941259 /* ActivityMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityMonitor.swift; sourceTree = ""; }; + EB04B24A750D5362449F8197 /* AlertsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertsView.swift; sourceTree = ""; }; + EBD012519AD3D674CC0D35FC /* CoverageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoverageTests.swift; sourceTree = ""; }; + EC292A1F1020AAA580DA3CDB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + EC63F61F2956394B88C762F4 /* ExtensionRebootTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionRebootTests.swift; sourceTree = ""; }; + ED54978358DD9DE1E792A8B9 /* VersionNamingRegressionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionNamingRegressionTests.swift; sourceTree = ""; }; + EFF0C2E06D541DAEC1BC5F33 /* DesignTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignTokens.swift; sourceTree = ""; }; + F05A2DD30C79643247AF74C9 /* VersionNameRepairTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionNameRepairTests.swift; sourceTree = ""; }; + F062E6D35F98D8EEF1EBE47C /* PacketSniffer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketSniffer.swift; sourceTree = ""; }; + F07BDE0C2D8005899C1AF21C /* InspectionBudgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectionBudgetView.swift; sourceTree = ""; }; + F186517132592B36ED2B9F80 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + F212ADB3B37A2EF68A7CFB84 /* FilterDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterDataProvider.swift; sourceTree = ""; }; + F3C96560CB05BDDBB136E34B /* PluginPackageVerifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PluginPackageVerifier.swift; sourceTree = ""; }; + F4408358C5CC9516B4C1ABCB /* LiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveView.swift; sourceTree = ""; }; + F529FE0E06B11298D8CD1E90 /* BlockingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockingTests.swift; sourceTree = ""; }; + F61F7D8D3D08054C7697792D /* AnomalySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnomalySettings.swift; sourceTree = ""; }; + F67F3203B4BE2D664F3B1EC9 /* InstalledApps.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledApps.swift; sourceTree = ""; }; + F6B4B0B76D53D8089C95762F /* IPOwnerLookup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPOwnerLookup.swift; sourceTree = ""; }; + F8406C2280A8FF08E883A1E0 /* MockRulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRulesView.swift; sourceTree = ""; }; + F8F8FB5C78D8391B25733C9B /* ResponseTransformRulesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseTransformRulesView.swift; sourceTree = ""; }; + FC0873969A030F170A6AA3F5 /* UpdateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateTests.swift; sourceTree = ""; }; + FC4ADEE1B3578FBC6DFD9B74 /* RulePackCatalogState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RulePackCatalogState.swift; sourceTree = ""; }; + FCD98C0A49FC6C5521129087 /* ReportsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportsView.swift; sourceTree = ""; }; + FD00CA1EF2A7DA909E3A31B5 /* RuleTemplates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RuleTemplates.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2D134D9B93ED0CF9B46F2117 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F929BE1C94FDF359E1B0F39 /* NetworkExtension.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4A59E2EDCDD8E4A557ED627B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BC092B149B32D158A62ADB8A /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 79DC5CAE407312B80BF20233 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B141482792DF3953D575CFF9 /* libsqlite3.tbd in Frameworks */, + 7A572D1F12B86CB4F91E72A0 /* NetworkExtension.framework in Frameworks */, + 06C9D883620A08BF10DBF82A /* SystemExtensions.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 983145C81A2D24465E7F44B6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C6E8C518995B36DB53128B05 /* libsqlite3.tbd in Frameworks */, + 2AFEE6E1F9393DE9D219552F /* NetworkExtension.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B516522A2EB85C9D1E4298D8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 607A677F2CEE245D16249316 /* NetworkExtension.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 01638FD6753C2AF708F580CA /* docs */ = { + isa = PBXGroup; + children = ( + 05B37DCC5CE723AABF1262DF /* docs */, + ); + path = docs; + sourceTree = ""; + }; + 05B37DCC5CE723AABF1262DF /* docs */ = { + isa = PBXGroup; + children = ( + 9EF395A2F3D6C97FF9EC53E4 /* index.html */, + ); + path = docs; + sourceTree = ""; + }; + 0CE3576DC40E71590960E248 /* Enrichment */ = { + isa = PBXGroup; + children = ( + 20CA8150CA012929A40558FB /* BPFProgram.swift */, + 3FD4661C1ABB39E65894AE7F /* CaptureAccess.swift */, + F6B4B0B76D53D8089C95762F /* IPOwnerLookup.swift */, + F062E6D35F98D8EEF1EBE47C /* PacketSniffer.swift */, + ); + path = Enrichment; + sourceTree = ""; + }; + 14FE4EA5DAAC3CF469DF2DF7 /* Channels */ = { + isa = PBXGroup; + children = ( + B9B6A48D086EF16CF6E438FF /* BluetoothMonitor.swift */, + CD774DADE526BE4F507BE06C /* DeviceModels.swift */, + CFC1036E5ABBFDB8740405F3 /* DeviceStore.swift */, + A903BAF9BBDCFEAEC2F023FF /* USBMonitor.swift */, + ); + path = Channels; + sourceTree = ""; + }; + 19F2ECDA2D0846DD0C8AA438 /* Flowlight */ = { + isa = PBXGroup; + children = ( + 615E4FAE5D0865FB1E2492E8 /* Assets.xcassets */, + 4017B3BE9E7FC6895D23FB6C /* Flowlight-AppStore.entitlements */, + AEB593C0CD03CAA473F143ED /* Flowlight.entitlements */, + A5A9D356FF073F1DA1C05522 /* Info.plist */, + 3944E092E097CA9FE66602C2 /* Analysis */, + AD43AD3D26806E2C0D8E2898 /* App */, + 7E89EFDC08791E588B285D1C /* Ask */, + F6C47AC904440C94AFC4016D /* Capture */, + 14FE4EA5DAAC3CF469DF2DF7 /* Channels */, + 0CE3576DC40E71590960E248 /* Enrichment */, + 85B9DE62499BF1EAB938A4A7 /* Export */, + 36C0E584D1897E1022A44014 /* Inspection */, + 1C0216F524771DC67009B967 /* Localization */, + 76EBCF9D9239BC88E1A6B467 /* Plugins */, + C23D46CAD0729079B295BF85 /* Resources */, + BA858536CDA7B1F73C14DC7D /* Storage */, + AFB91EF695297110D08D29F5 /* UI */, + ); + path = Flowlight; + sourceTree = ""; + }; + 1C0216F524771DC67009B967 /* Localization */ = { + isa = PBXGroup; + children = ( + 33480D5241332B3AA21CBE49 /* Localization.swift */, + 77D58ED5F4678FC1C2A5634A /* Localizable.strings */, + ); + path = Localization; + sourceTree = ""; + }; + 315048F637ED4E869E58FC34 /* FlowlightExtension */ = { + isa = PBXGroup; + children = ( + 7BA6FB03454241CB84A9AA13 /* BlockEnforcer.swift */, + F212ADB3B37A2EF68A7CFB84 /* FilterDataProvider.swift */, + D7DE406298624DC5F3A82A22 /* FlowlightExtension-AppStore.entitlements */, + A95B12B83D0B4346AF52BDA6 /* FlowlightExtension.entitlements */, + 3C8267406A5D7DA536B7A713 /* FlowTracker.swift */, + 8EF576B7B41898D84B4E487F /* Info-AppStore.plist */, + 06816A9441C5EFEF5EF55CA5 /* Info.plist */, + AC8A0C2D83843716604FD3F0 /* IPCServer.swift */, + F186517132592B36ED2B9F80 /* main.swift */, + 0F2F1F8536857610FB4C9854 /* ProcessResolver.swift */, + ); + path = FlowlightExtension; + sourceTree = ""; + }; + 36C0E584D1897E1022A44014 /* Inspection */ = { + isa = PBXGroup; + children = ( + 6652559787FD52622A19834A /* CertificateAuthority.swift */, + 15456E37F11CE5E19A124753 /* GuardrailEngine.swift */, + 6E8974956FEBD82934CA1EB5 /* HTTPStream.swift */, + 6AF0ACB7FCA10D7758DE177D /* InspectionBudget.swift */, + 15E51941A085C6B16AF395BB /* InspectionController.swift */, + 1FD96902AACB4B557DEFFBCD /* InspectionProxy.swift */, + DCCB2008E4820D1DE1DE154F /* InspectionRecorder.swift */, + 4D9926D17DD57B7F97E895C9 /* JSONValue.swift */, + 95765A2F0D026D17736C9D9D /* LLMFacts.swift */, + AFAEE09994253E82748BCCCB /* LLMToolCalls.swift */, + CAC8A1658834152DBFBA4494 /* MockGate.swift */, + E7FBB33595155CF835AF14D5 /* MockRule.swift */, + C18286421CD591157CF1E1FD /* ProxyJanitor.swift */, + A7BDAE5D54ABFD08CCFFE447 /* ProxyRelaunch.swift */, + AA9340FE2B6C417D1A19AF54 /* ResponseGate.swift */, + 61D6646248D4CDF3EB86A893 /* ResponseScriptRunner.swift */, + DB223BC3AD00430A5673C439 /* ResponseTransformRule.swift */, + AFA3B4EB0E0D40E39CE24E1B /* RewriteRule.swift */, + C8251DBDC21C44CB92CC1C67 /* SettingsEnforcer.swift */, + 1B2E7474FB6A7B8B56B98917 /* ToolActivity.swift */, + 98FE7804F3D1F6A247F0C8DF /* ToolCallLinks.swift */, + E6A7703953570391821257DD /* ToolResults.swift */, + ); + path = Inspection; + sourceTree = ""; + }; + 3944E092E097CA9FE66602C2 /* Analysis */ = { + isa = PBXGroup; + children = ( + E872723F2D92AA78F7941259 /* ActivityMonitor.swift */, + 41B98E13F994F7E684F57C07 /* AgentAttributor.swift */, + 09E79F3A686C0EC5D7B28E8C /* AgentWorkspace.swift */, + 21A2E14BFE5E66664D0A604B /* AnomalyEngine.swift */, + F61F7D8D3D08054C7697792D /* AnomalySettings.swift */, + ABD4C8B6E3620F5E46C69434 /* BuiltInRulePacks.swift */, + 9EC52100D779B101B1B2595F /* Coverage.swift */, + A62A00EA0C0D8B7844E6F7B2 /* DestinationProfile.swift */, + 2CC957336FC5BD77D7A81651 /* Focus.swift */, + D9195A6149AE1C6628A3E184 /* GuardrailStore.swift */, + F67F3203B4BE2D664F3B1EC9 /* InstalledApps.swift */, + 93E71941B27710D83594A6C5 /* LocalRiskAnalysis.swift */, + 37FE9D6F8BA82F3C266E147A /* MCPAttribution.swift */, + 2D6CCA395BF33CDF9F92B725 /* MCPDomains.swift */, + 2D1D13FDE75AF5064805D258 /* Notifier.swift */, + E858E52F162361C6FD039F16 /* RulePackCatalogComposition.swift */, + FC4ADEE1B3578FBC6DFD9B74 /* RulePackCatalogState.swift */, + 738E050AC8811051BF14E529 /* RulePackCatalogUpdater.swift */, + C35EF76A8728F308E2D6973A /* RulePackCatalogVerifier.swift */, + A15168A448857A6CC759F7BB /* RulePackEventDelivery.swift */, + 02B5736850B28B462739C2CD /* RulePackStore.swift */, + 97943E847A22CF491FA82084 /* RuleStore.swift */, + FD00CA1EF2A7DA909E3A31B5 /* RuleTemplates.swift */, + ); + path = Analysis; + sourceTree = ""; + }; + 47D0F2D7B8D7DEDEA845284F /* FlowlightTests */ = { + isa = PBXGroup; + children = ( + DD30777A046F705110A99269 /* AgentLauncherTests.swift */, + 3B07796D1108F037FF196443 /* AgentPolicyTests.swift */, + DC8F91DE12A1C58BB2BD7038 /* AgentTests.swift */, + B484EC45F6D3CF2D66D12BE0 /* AgentWorkspaceTests.swift */, + 15380DABDCB2492A132A90E4 /* AnswerTextTests.swift */, + CF28074238079D33EFB6B862 /* AppleSystemAppTests.swift */, + 4D73C529EED550F2BD81CB72 /* AppLifecycleTests.swift */, + 94004173EC96619B41EDF49F /* AskFeatureTests.swift */, + CB78709D1E01638E63A484D3 /* AskTests.swift */, + F529FE0E06B11298D8CD1E90 /* BlockingTests.swift */, + 2B95789E8FFF77D3182BADCF /* BodySearchTests.swift */, + 810530D0FFDE61BE5CDB4CC2 /* BoundedHTTPDataTransportTests.swift */, + EBD012519AD3D674CC0D35FC /* CoverageTests.swift */, + 9D6A2870B379B2C1C171C7A3 /* DatabaseTests.swift */, + E83A96A61DE59D2731045A8C /* DemoDataTests.swift */, + 22C46B9250A6ADDFD915500B /* DestinationProfileTests.swift */, + 638E7A9BEB644503868C49E9 /* DeviceTests.swift */, + 89C74F92FC42AE36F5D97F1F /* EnrichmentTests.swift */, + DCF7C56CAF72886BEB812F8F /* ExportDisclosureTests.swift */, + 8E01AEB9AB4F8723FFFA4BFB /* ExportTests.swift */, + AE2A4754CFE5FD187CAF66AD /* ExportVisibilityTests.swift */, + EC63F61F2956394B88C762F4 /* ExtensionRebootTests.swift */, + 2747CAE7AD41663488F0E2B9 /* ExtensionRecoveryTests.swift */, + 1B2EB4E838E550B396BDB883 /* ExtensionSourceTests.swift */, + 2CFC920FE55E719B46039E1F /* FlowJudgementTests.swift */, + 50FB4666B2D07DDE032C87EC /* FocusTests.swift */, + 08A401B3A5D8ED9031EAAF03 /* GuardrailTests.swift */, + 351C523438EA0A811504B57C /* HelpTests.swift */, + A2A5AC7D1719857AE8ED1CFA /* InsightsTests.swift */, + 2E4DFA9032765BBB7E75706F /* InspectionBudgetTests.swift */, + 70F169CF4776BE3FAF69AE73 /* InspectionTests.swift */, + C3E4E7F1E8B83D086AF0CB1B /* InspectNavigationTests.swift */, + 5BC2D26D49B4E14A148BE9C6 /* InspectScopeTests.swift */, + 76D752E3A8C7633C8BC939BE /* InstalledAppsTests.swift */, + 5C0F9AC24A75E20F3FA0B2BB /* LocalizationTests.swift */, + 64FEF0DA4ACD3157DA6FA4B3 /* LocalRiskAnalysisTests.swift */, + 02EE3A99F49A058BF061C147 /* MCPAttributionTests.swift */, + 34AD2BFFA35727FB39287960 /* MCPDomainsTests.swift */, + 2E35905A6578A1204796962E /* MockResponseTests.swift */, + ADD9D2D024F76347C8414BD5 /* NetworkChannelTests.swift */, + 15AF59D58B332F548630D949 /* ParserTests.swift */, + 22D460484C8D6DFA5D495132 /* PluginTests.swift */, + 45076E14820DDD4CFF352226 /* ProxyJanitorTests.swift */, + 13D29667127E5DE57908D936 /* ProxyRelaunchTests.swift */, + 0ADADFFC230017F80D707ECE /* ResponseTransformTests.swift */, + 694D30A62FAF11702B7EF605 /* RewriteRuleTests.swift */, + CB1C1786F72F8D0BC95B9BAC /* RulePackCatalogPersistenceTests.swift */, + 59B40E5AD74F74A029AD46E4 /* RulePackCatalogTests.swift */, + 8507D8801643823A18134BF8 /* RulePackCatalogUpdaterTests.swift */, + AB0C0840C443F8AEDD254AE0 /* RulePackEventDeliveryTests.swift */, + 08C5F9CC0D644DCA03F5F4C5 /* RulePackTests.swift */, + AAD9DD248FDC1D5D58EFC726 /* RuleSimulationTests.swift */, + 254FA06DF59A8410C9BAE161 /* RuleTemplateTests.swift */, + 7EEA2706008C57CB75FB17CD /* RuleTests.swift */, + 2E1E1E6E8B1C2130BD563759 /* SettingsEnforcerTests.swift */, + D2DD7D42B7798A6C57F8C49E /* SystemExtensionScanTests.swift */, + CCA8D35E21C4BC1F15368DE3 /* TrafficMonitorRulePackStartupTests.swift */, + 158356080B1479D37407B9F7 /* TrafficTreePagingTests.swift */, + FC0873969A030F170A6AA3F5 /* UpdateTests.swift */, + 21FEECAD5C958CF49A659E14 /* UpdateVerificationTests.swift */, + F05A2DD30C79643247AF74C9 /* VersionNameRepairTests.swift */, + ED54978358DD9DE1E792A8B9 /* VersionNamingRegressionTests.swift */, + 70965BF26E0B4B3F9719122B /* WindowVisibilityTests.swift */, + 9D7230F1DB0AC11FC9FD80EE /* Fixtures */, + ); + path = FlowlightTests; + sourceTree = ""; + }; + 76EBCF9D9239BC88E1A6B467 /* Plugins */ = { + isa = PBXGroup; + children = ( + A0A1C1F3361CA62C0D08C168 /* PluginEngine.swift */, + 07F902D9D498F399BBDD85E0 /* PluginModels.swift */, + F3C96560CB05BDDBB136E34B /* PluginPackageVerifier.swift */, + E593C4ED11E1BCADD22099E6 /* PluginScriptRunner.swift */, + A55A095537DB24454B007D1B /* PluginStore.swift */, + ); + path = Plugins; + sourceTree = ""; + }; + 7CEBEFFB19C7CA1A293946A5 /* Classification */ = { + isa = PBXGroup; + children = ( + 3D61C3343882268C81871C9B /* DNSParser.swift */, + 228B5C4135EAD9D85F91ED0E /* HTTPHostParser.swift */, + 76792B4893790E9ACD4BFA8B /* ProtocolCatalog.swift */, + 3C533BB77B419198656C6284 /* ProtocolClassifier.swift */, + B5C4444B7A84352BE3672C41 /* TLSSNIParser.swift */, + ); + path = Classification; + sourceTree = ""; + }; + 7E89EFDC08791E588B285D1C /* Ask */ = { + isa = PBXGroup; + children = ( + 14C234AF77E7451A1505DDF9 /* AskChart.swift */, + 67763C99431F26FE1D428EA2 /* AskController.swift */, + 7611E8788B3B6AF18F1CEDF7 /* AskEnvironment.swift */, + D59A773537F63761107681A3 /* AskProvider.swift */, + 415931FB0EB29261A56B90C7 /* AskQuery.swift */, + DD71004CFB571B9167866770 /* AskQueryRunner.swift */, + 82D568056D9E6FACAC42D563 /* FeatureGuide.swift */, + 4EEDBAB278885D747B420AD3 /* OnDeviceAsk.swift */, + 74F1DEAAAAAA607CEA5EC303 /* OnDeviceRiskProvider.swift */, + 91657F4898EFEBCB551ADD4E /* RemoteAsk.swift */, + ); + path = Ask; + sourceTree = ""; + }; + 85B9DE62499BF1EAB938A4A7 /* Export */ = { + isa = PBXGroup; + children = ( + 4D2C6211A645D4DDF8526DF2 /* ExportController.swift */, + CF2DEA93C3D6844E3345D2D8 /* ExportDisclosure.swift */, + AA72D307E4B1A08BE4B8AEF8 /* ExportDisclosureSheet.swift */, + BF216452A0F90D9E90A6BD34 /* ExportModels.swift */, + 3FD3230056607B454EAC381D /* ExportPayload.swift */, + 719C08673D2446F21DAF9F54 /* ExportQueue.swift */, + 37AE72E8F916C18A468E968A /* ExportSecrets.swift */, + 2B82FFB06C5A1C98D5E4D7D1 /* ExportSettingsView.swift */, + ); + path = Export; + sourceTree = ""; + }; + 8AB062F3019C5E4A8D16A9E9 /* Shared */ = { + isa = PBXGroup; + children = ( + D5656604B2CFCBB61EFE050C /* AgentCatalog.swift */, + 440DB80190A1847AC834210D /* AgentLauncher.swift */, + AF99FCE4EBE61D20FFC1E2F1 /* AgentPolicy.swift */, + D16976C5552006B1F9975A62 /* AppleSystemApps.swift */, + 80BC5E16F824FC642C12C8B0 /* BlockRules.swift */, + 38E49720B1B25DC9EBB2ABA0 /* Constants.swift */, + 0872CE92A9A3D5A785ECC816 /* GlobMatch.swift */, + 11A65C830B699BC4477CA879 /* Guardrail.swift */, + 3EA83082A5085897BE34D963 /* HostCanonicalizer.swift */, + 96A2DDEBC714CDCFDB919F35 /* IPCProtocol.swift */, + 59A21E183B79E3C66146070D /* NetworkChannel.swift */, + 4F383DF6343F2DB3052413C9 /* NetworkScope.swift */, + 94F3F458498856491A40E88C /* ProcessNaming.swift */, + 92BAF46D43D2171398478FC3 /* Rule.swift */, + 10036A17CDFCA45E068708EE /* RulePack.swift */, + 10E3B19A61C74DA87F74E4CA /* RulePackSimulation.swift */, + A30AC102A5B36107D8B6B31F /* RulePackTransfer.swift */, + 5D8BAA4EB36D9B7D7BF56AD1 /* RuleSimulation.swift */, + 6096AB6A3EF78490BE10DF50 /* TrafficModels.swift */, + 7CEBEFFB19C7CA1A293946A5 /* Classification */, + ); + path = Shared; + sourceTree = ""; + }; + 9D7230F1DB0AC11FC9FD80EE /* Fixtures */ = { + isa = PBXGroup; + children = ( + 76B6293D3AAFF511F855C4E6 /* IPCServer.txt */, + ); + path = Fixtures; + sourceTree = ""; + }; + A6B39D870B3CF6E7A6C31AD3 /* Products */ = { + isa = PBXGroup; + children = ( + 6F9EEC138B6EE3479F9F10E0 /* Flowlight.app */, + 6053ADC7641DB8CAEA9390D6 /* FlowlightAppStore.app */, + D1C046DCF0CB1227CA93DA24 /* FlowlightExtension.systemextension */, + BD0D85E63A3FEC65FE1FD068 /* FlowlightResponseScriptHelper */, + 9341EDA5AB3454E82FECD53A /* FlowlightStoreExtension.appex */, + 0CBBF571DC526F85E7232F79 /* FlowlightTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + AD43AD3D26806E2C0D8E2898 /* App */ = { + isa = PBXGroup; + children = ( + B0158F10AEABEF28A925E8C3 /* AppNavigation.swift */, + 9DA4611687EF2F8AADA58A49 /* AppRestart.swift */, + 78D5C4691F1B4DFDDCC1A705 /* BoundedHTTPDataTransport.swift */, + 168D824382963305ED7E6C04 /* CodeSignatureCheck.swift */, + 594F3762D9AD6347C83BA710 /* DemoData.swift */, + 9FFEA980768CD488D58CC0B1 /* DemoInspection.swift */, + B3244269609CC161996866B5 /* FlowlightApp.swift */, + 5C34C9D0A9B302B4CF4C7125 /* HTTPDataTransport.swift */, + DBC0A436E879000F8F5FF9E7 /* TrafficMonitor.swift */, + 9C9C36E21D6DB161C80DF3F6 /* UpdateChecker.swift */, + 121FF2EBC93394E8EDCFF0BF /* UpdateInstaller.swift */, + E45902808344F173033EB0F5 /* WindowVisibility.swift */, + ); + path = App; + sourceTree = ""; + }; + ADA9F48B47F7D9E8BA6C8F1C /* Frameworks */ = { + isa = PBXGroup; + children = ( + C087727B358A400DCFD7E0E6 /* JavaScriptCore.framework */, + 0A12EC605B35B8042A369205 /* libsqlite3.tbd */, + 8ACA1ABA6B37B6457004C94A /* NetworkExtension.framework */, + 81F190466C9691ADAF7BC8DA /* SystemExtensions.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + AFB91EF695297110D08D29F5 /* UI */ = { + isa = PBXGroup; + children = ( + 082111849A66652DD9F1BE01 /* AgentsModel.swift */, + 81434EE3C45929E8A768D42E /* AgentsView.swift */, + EB04B24A750D5362449F8197 /* AlertsView.swift */, + 41AE1A6CC673544FCEC9E7F4 /* AskView.swift */, + 5B9F2521A73E6E3264F557E6 /* CaptureView.swift */, + 61823557D86136986EEE4A18 /* CaptureWarning.swift */, + 3C1CF4C48AA260D71155C022 /* Components.swift */, + 92FDE4C87CC59491B70BF3F3 /* ContentView.swift */, + B1C69EEECAA62FC98DBC8CB2 /* CoverageView.swift */, + EFF0C2E06D541DAEC1BC5F33 /* DesignTokens.swift */, + 4F2FBA5700CA1489D6740FC8 /* DevicesView.swift */, + 61080233ED162067497EE2E3 /* FocusView.swift */, + 8F08D1913575FFC1F548CAB5 /* GuardrailsPane.swift */, + F07BDE0C2D8005899C1AF21C /* InspectionBudgetView.swift */, + 406DB466CD32DA8223AE61A6 /* InspectMenuItems.swift */, + BFE93ABADFF46C961FCABAB8 /* InspectView.swift */, + 23CAA36BFFADC83D65DBF0FE /* JSONTreeView.swift */, + F4408358C5CC9516B4C1ABCB /* LiveView.swift */, + 662F0B94BED1CA47AD516AC9 /* LocalRiskSettingsSection.swift */, + 461E9D1F76A4F9505335AB87 /* LocalRiskViews.swift */, + B1888DEE22E9C2FCFB5DC064 /* MCPDomainsSection.swift */, + F8406C2280A8FF08E883A1E0 /* MockRulesView.swift */, + 992F80EF7B17CA25C7D83AC8 /* Motion.swift */, + 02ACC341615D95ADA623BBEC /* PluginSettingsView.swift */, + FCD98C0A49FC6C5521129087 /* ReportsView.swift */, + F8F8FB5C78D8391B25733C9B /* ResponseTransformRulesView.swift */, + 44CCD94E9D554D6DD61486FF /* RewriteRulesView.swift */, + 08643257F8D11784563BD6CC /* RuleEditor.swift */, + 089476A21B8A6AE7F3F4A53A /* RulePackEditorDraft.swift */, + 9CC12B7176A61DD80F12043A /* RulePacksView.swift */, + 9B910FBB81CDAC17AE5ACCEA /* RuleSimulationView.swift */, + 88962BAF6E215B83FE0AFF9A /* RulesView.swift */, + B4849A413C60A9ABC4F9C16E /* SettingsView.swift */, + AC02CB8000B00C4C0AD84E60 /* SharedStrings.swift */, + 3B2FA5540C38FA293E3EB457 /* TrafficTree.swift */, + D210A86033CB79C792000CA2 /* UpdateView.swift */, + B9A40907CF2A6CAF3E9583A1 /* Insights */, + ); + path = UI; + sourceTree = ""; + }; + B9A40907CF2A6CAF3E9583A1 /* Insights */ = { + isa = PBXGroup; + children = ( + BB40E7DB142C886F94FE2448 /* BehaviourPanel.swift */, + 9C0843B4BD70F8F83167F2D3 /* InsightsModel.swift */, + 7FA151AA64480DAACC602123 /* InsightsPanel.swift */, + ); + path = Insights; + sourceTree = ""; + }; + BA64269E7DEB0D9E7F9ED3D0 /* RulePacks */ = { + isa = PBXGroup; + children = ( + 1F49F6CFAF06DFBB9416246D /* official-rule-packs-v1-public.pem */, + ADDB360F7DA88D34505F4D8A /* official.json */, + ); + path = RulePacks; + sourceTree = ""; + }; + BA858536CDA7B1F73C14DC7D /* Storage */ = { + isa = PBXGroup; + children = ( + 48B24C254E2C17056730C06B /* RulePackDeliveryStats.swift */, + 9D9FCA36BD4A101EA1F02DFF /* SQLite.swift */, + 94538A9E26BCD8960123C7E4 /* TrafficDatabase.swift */, + ); + path = Storage; + sourceTree = ""; + }; + C23D46CAD0729079B295BF85 /* Resources */ = { + isa = PBXGroup; + children = ( + 20C95610696E32B96E500E8F /* bpf-access.sh */, + BA64269E7DEB0D9E7F9ED3D0 /* RulePacks */, + ); + path = Resources; + sourceTree = ""; + }; + DC95BF9D5F32304264FF7BD0 = { + isa = PBXGroup; + children = ( + 01638FD6753C2AF708F580CA /* docs */, + 19F2ECDA2D0846DD0C8AA438 /* Flowlight */, + 315048F637ED4E869E58FC34 /* FlowlightExtension */, + F377D0F1A3D6A6F8C5DC5F1A /* FlowlightResponseScriptHelper */, + 47D0F2D7B8D7DEDEA845284F /* FlowlightTests */, + 8AB062F3019C5E4A8D16A9E9 /* Shared */, + ADA9F48B47F7D9E8BA6C8F1C /* Frameworks */, + A6B39D870B3CF6E7A6C31AD3 /* Products */, + ); + sourceTree = ""; + }; + F377D0F1A3D6A6F8C5DC5F1A /* FlowlightResponseScriptHelper */ = { + isa = PBXGroup; + children = ( + 8CB82D0B63E8C783DD0A4FB5 /* main.swift */, + ); + path = FlowlightResponseScriptHelper; + sourceTree = ""; + }; + F6C47AC904440C94AFC4016D /* Capture */ = { + isa = PBXGroup; + children = ( + 53217054F0EFD8EC322BC5B1 /* ExtensionManager.swift */, + 1218F146542CC01A417469F9 /* ExtensionRecovery.swift */, + 95761708CD76CABDF0696BCE /* ExtensionTrafficSource.swift */, + 497DF4817317CE033F2A83A2 /* NettopParser.swift */, + 957EEA0C3C7342504E533506 /* NettopTrafficSource.swift */, + E489125D1DBF3EF98AEED4EB /* ProcessLookup.swift */, + A617D9483BCC31A0F4200A90 /* SystemExtensionScan.swift */, + C4A370EA2BA551D5351835E6 /* TrafficSource.swift */, + ); + path = Capture; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0249194ABEFD25813E6C14AB /* FlowlightTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D4671AC947DCF84267F4477 /* Build configuration list for PBXNativeTarget "FlowlightTests" */; + buildPhases = ( + B00A2CB40DA6AAFDB17121AE /* Sources */, + 98EFD6B37E21EF6F78800814 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 531D8A14230A1D40ACDD824B /* PBXTargetDependency */, + ); + name = FlowlightTests; + packageProductDependencies = ( + ); + productName = FlowlightTests; + productReference = 0CBBF571DC526F85E7232F79 /* FlowlightTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 0E90A4F6F62FF71E3D3A1786 /* FlowlightAppStore */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0F10D312DC2BCA5C48705215 /* Build configuration list for PBXNativeTarget "FlowlightAppStore" */; + buildPhases = ( + F4C8991BC53B54019DDD0015 /* Sources */, + 17E6317CE53AA648F1E6BA08 /* Resources */, + 983145C81A2D24465E7F44B6 /* Frameworks */, + 32FF3A971C555C5CD158F63B /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + ECC654C18DFE8F2D4FE918A4 /* PBXTargetDependency */, + ); + name = FlowlightAppStore; + packageProductDependencies = ( + ); + productName = FlowlightAppStore; + productReference = 6053ADC7641DB8CAEA9390D6 /* FlowlightAppStore.app */; + productType = "com.apple.product-type.application"; + }; + 1C9BF0C33D1912981FB4B5AD /* Flowlight */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4A74C79A97028F05EA626F95 /* Build configuration list for PBXNativeTarget "Flowlight" */; + buildPhases = ( + BB99E7E633832FA71E20AC59 /* Sources */, + E9FFBAE829733C47C6BC58DA /* Resources */, + 79DC5CAE407312B80BF20233 /* Frameworks */, + BD32BB41996D3CEEDBC8D17E /* Embed Dependencies */, + 645C1B96C25EC035E5415BD4 /* Embed Dependencies */, + ); + buildRules = ( + ); + dependencies = ( + CBC6CA3966123861544E6E1F /* PBXTargetDependency */, + 0945A62A6C0D7F91032CFD50 /* PBXTargetDependency */, + ); + name = Flowlight; + packageProductDependencies = ( + ); + productName = Flowlight; + productReference = 6F9EEC138B6EE3479F9F10E0 /* Flowlight.app */; + productType = "com.apple.product-type.application"; + }; + 36B21D467163CD9F57115778 /* FlowlightResponseScriptHelper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33A9FF4B8D9B2D5D15133A18 /* Build configuration list for PBXNativeTarget "FlowlightResponseScriptHelper" */; + buildPhases = ( + 3D320DCA90917018F4FC54BF /* Sources */, + 4A59E2EDCDD8E4A557ED627B /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FlowlightResponseScriptHelper; + packageProductDependencies = ( + ); + productName = FlowlightResponseScriptHelper; + productReference = BD0D85E63A3FEC65FE1FD068 /* FlowlightResponseScriptHelper */; + productType = "com.apple.product-type.tool"; + }; + 904DAC0BB81071A09FF1A5B0 /* FlowlightStoreExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = D76A79764257B12EB4B0EB70 /* Build configuration list for PBXNativeTarget "FlowlightStoreExtension" */; + buildPhases = ( + 44DFDBB900EDE29B4C67144D /* Sources */, + 2D134D9B93ED0CF9B46F2117 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FlowlightStoreExtension; + packageProductDependencies = ( + ); + productName = FlowlightStoreExtension; + productReference = 9341EDA5AB3454E82FECD53A /* FlowlightStoreExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 94D00543044D9B601CDCA877 /* FlowlightExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6C5A1D60ED3AC8932FFE1FB1 /* Build configuration list for PBXNativeTarget "FlowlightExtension" */; + buildPhases = ( + D08D03E8FB49A5314F071BB1 /* Sources */, + B516522A2EB85C9D1E4298D8 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FlowlightExtension; + packageProductDependencies = ( + ); + productName = FlowlightExtension; + productReference = D1C046DCF0CB1227CA93DA24 /* FlowlightExtension.systemextension */; + productType = "com.apple.product-type.system-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 27052BCDFA1783A148CD45FD /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + TargetAttributes = { + 0249194ABEFD25813E6C14AB = { + ProvisioningStyle = Automatic; + }; + 0E90A4F6F62FF71E3D3A1786 = { + ProvisioningStyle = Automatic; + }; + 1C9BF0C33D1912981FB4B5AD = { + ProvisioningStyle = Automatic; + }; + 36B21D467163CD9F57115778 = { + ProvisioningStyle = Automatic; + }; + 904DAC0BB81071A09FF1A5B0 = { + ProvisioningStyle = Automatic; + }; + 94D00543044D9B601CDCA877 = { + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = CA490C327FA0F549ADD0301B /* Build configuration list for PBXProject "Flowlight" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + de, + en, + es, + fr, + it, + ja, + ko, + "pt-PT", + "zh-Hans", + "zh-Hant", + ); + mainGroup = DC95BF9D5F32304264FF7BD0; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = A6B39D870B3CF6E7A6C31AD3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1C9BF0C33D1912981FB4B5AD /* Flowlight */, + 36B21D467163CD9F57115778 /* FlowlightResponseScriptHelper */, + 94D00543044D9B601CDCA877 /* FlowlightExtension */, + 904DAC0BB81071A09FF1A5B0 /* FlowlightStoreExtension */, + 0E90A4F6F62FF71E3D3A1786 /* FlowlightAppStore */, + 0249194ABEFD25813E6C14AB /* FlowlightTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 17E6317CE53AA648F1E6BA08 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 93937351BA21608974D54900 /* Assets.xcassets in Resources */, + 57DADB20CBF7D6EF6F6B8167 /* Localizable.strings in Resources */, + E384EA8E1EEBA1689E638B8C /* official-rule-packs-v1-public.pem in Resources */, + 7C4D73113ECB44CDDAB40D58 /* official.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 98EFD6B37E21EF6F78800814 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E62BAD317B20BE6E16A21FA3 /* IPCServer.txt in Resources */, + 46A21D07D20963DBAC9169F6 /* index.html in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E9FFBAE829733C47C6BC58DA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 70B794AEAC36D7B581841A5D /* Assets.xcassets in Resources */, + C57A3811A5DB984FC0F2549A /* Localizable.strings in Resources */, + D5D014F2811B94832DC6CC81 /* bpf-access.sh in Resources */, + B5F94B9F6FC2B75A867FB2F8 /* official-rule-packs-v1-public.pem in Resources */, + 48CD1538B6B7899F0B8A83E8 /* official.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3D320DCA90917018F4FC54BF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EAA7D632ABC5F2450CDDB68E /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 44DFDBB900EDE29B4C67144D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0500979C1F127E3E8BAC2C0F /* AgentCatalog.swift in Sources */, + 1F8686DCB3451158B115A8FD /* AgentLauncher.swift in Sources */, + 1E0AB61964E7FD024B5B4E71 /* AgentPolicy.swift in Sources */, + 3570CB0F911ED4160DC8F4BD /* AppleSystemApps.swift in Sources */, + 13299931E36F0173B3FCDC1B /* BlockEnforcer.swift in Sources */, + 9D9CC413EDA13E69B872454F /* BlockRules.swift in Sources */, + B13CAA0E1DA5A274F3F4D849 /* Constants.swift in Sources */, + 7212BA0F348AC67423887CF5 /* DNSParser.swift in Sources */, + B8AF34F3100E3ABF6190BE68 /* FilterDataProvider.swift in Sources */, + 5B0715A36BAB76BC06AE4052 /* FlowTracker.swift in Sources */, + EF0EBBEAC6177681CBD4F0D7 /* GlobMatch.swift in Sources */, + 2C879C6EA95A548B2BC9D9DB /* Guardrail.swift in Sources */, + 654EE33CAE5B208F04985952 /* HTTPHostParser.swift in Sources */, + 518B305308454622B576FF3B /* HostCanonicalizer.swift in Sources */, + 7D0431D1C2B4142A2A3B9A2D /* IPCProtocol.swift in Sources */, + FB53CA12F4EA8442D4E773E4 /* IPCServer.swift in Sources */, + B7D99A1E19A198CB04FDDC73 /* NetworkChannel.swift in Sources */, + EF4CBFD483B59B62F3432F3E /* NetworkScope.swift in Sources */, + 1D997A2137B9445F4D423737 /* ProcessNaming.swift in Sources */, + EE32964EF451CD9211A37D6A /* ProcessResolver.swift in Sources */, + 8D8D47E8D81B928A8895178A /* ProtocolCatalog.swift in Sources */, + 9891F943C7CAD36651D24774 /* ProtocolClassifier.swift in Sources */, + 91433E64078D356DD3940C57 /* Rule.swift in Sources */, + 26C4AD2122DB5A299CA57CE6 /* RulePack.swift in Sources */, + C85056033D72ECD693E4AE7A /* RulePackSimulation.swift in Sources */, + ECE292CA7FBB8A6CE372B4F5 /* RulePackTransfer.swift in Sources */, + F454E718DC7E6F7BDA3ECA61 /* RuleSimulation.swift in Sources */, + BBCAB0EE0D040C8BF3E30556 /* TLSSNIParser.swift in Sources */, + 668FFA90C24788C66043286B /* TrafficModels.swift in Sources */, + 45C6C2569D63744568474B91 /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B00A2CB40DA6AAFDB17121AE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FF3F2EE3FE29F6827D527B31 /* AgentLauncherTests.swift in Sources */, + 489DB4725FD189472CC078BE /* AgentPolicyTests.swift in Sources */, + 2499CE8E13B7B57DDA281E39 /* AgentTests.swift in Sources */, + EA2D23AFA530F762A6901E08 /* AgentWorkspaceTests.swift in Sources */, + FACBCE71B0804DB4187D132B /* AnswerTextTests.swift in Sources */, + E8F73E4CF1E8701968CB2E96 /* AppLifecycleTests.swift in Sources */, + B766E7284317D94D160C1386 /* AppleSystemAppTests.swift in Sources */, + 72FCD2D719346EDC2EE58A6E /* AskFeatureTests.swift in Sources */, + 87E68C01975E4936B8D6A921 /* AskTests.swift in Sources */, + 24582219230DE364D6B2E2D1 /* BlockingTests.swift in Sources */, + B40A4A6A12B15C206C69FE22 /* BodySearchTests.swift in Sources */, + D690491C9CCCFFA1DE64ECE8 /* BoundedHTTPDataTransportTests.swift in Sources */, + B87A6542EDA6ACDB5B961EFA /* CoverageTests.swift in Sources */, + 06D7DABCED6EF2ED5BD1B725 /* DatabaseTests.swift in Sources */, + DE472CC9E3475EF582BB706E /* DemoDataTests.swift in Sources */, + 8658DBDD8DE41686E075C7B0 /* DestinationProfileTests.swift in Sources */, + 9B22FA903C576B32C9232523 /* DeviceTests.swift in Sources */, + C2587EAF39C9E71650F3B6FC /* EnrichmentTests.swift in Sources */, + 64453A2D3AA57975F870BAE4 /* ExportDisclosureTests.swift in Sources */, + 1ADF39B07A56B2AFFC721C1B /* ExportTests.swift in Sources */, + 41EEA62E4E2A0DDC2FA6C7AC /* ExportVisibilityTests.swift in Sources */, + B5A31798C953DDD61039E82D /* ExtensionRebootTests.swift in Sources */, + 5EC8847DF0E49875B602B9AA /* ExtensionRecoveryTests.swift in Sources */, + CD507B163DA11479FAFBF2A6 /* ExtensionSourceTests.swift in Sources */, + 9DA08B1BDE7F624176CB2AF2 /* FlowJudgementTests.swift in Sources */, + 3EB92870A15033FFE64CA6A4 /* FocusTests.swift in Sources */, + 9524F078035F746A98A5BD1A /* GuardrailTests.swift in Sources */, + FD08E709481530B77F4ED795 /* HelpTests.swift in Sources */, + D57246BD18C4FBBCEA71F08A /* InsightsTests.swift in Sources */, + C646009EEAACFFED739EA0E9 /* InspectNavigationTests.swift in Sources */, + 7471DD6A1CB6304ECCFD0C3B /* InspectScopeTests.swift in Sources */, + F7D8E5F618EF5B76959097BF /* InspectionBudgetTests.swift in Sources */, + FE234FA5F34AAB7B7074BDB9 /* InspectionTests.swift in Sources */, + F1ACC6A35E482FC31C0EA0B1 /* InstalledAppsTests.swift in Sources */, + 498E9916E85245C7982E9110 /* LocalRiskAnalysisTests.swift in Sources */, + D211B6AF0F0C9ABE3F5D1A57 /* LocalizationTests.swift in Sources */, + A83BA0983BAC28C6E56B49BE /* MCPAttributionTests.swift in Sources */, + 2072AA79A8637D84267BE43F /* MCPDomainsTests.swift in Sources */, + 8BD67221A510AAB93D73CC7D /* MockResponseTests.swift in Sources */, + 5A3B1EB5936B67AD426A5967 /* NetworkChannelTests.swift in Sources */, + 657B4D3A0DC9860BCAA78E25 /* ParserTests.swift in Sources */, + E3F2CFD47F40B6A9481C5777 /* PluginTests.swift in Sources */, + ADC857099AB3E324DEC334BC /* ProxyJanitorTests.swift in Sources */, + ED1CF3BBC1C4D317658D07A0 /* ProxyRelaunchTests.swift in Sources */, + 697ACED9A5F7CF5854461210 /* ResponseTransformTests.swift in Sources */, + 8753FD9223EF6AE4C892DB9A /* RewriteRuleTests.swift in Sources */, + BEC1503B1920AF74D38E2077 /* RulePackCatalogPersistenceTests.swift in Sources */, + 413D6E44997AA769C597FF23 /* RulePackCatalogTests.swift in Sources */, + 4F732CB0B9C2FB627217CC17 /* RulePackCatalogUpdaterTests.swift in Sources */, + ACC7529D79C19667761AEAD2 /* RulePackEventDeliveryTests.swift in Sources */, + 059D1C5ECA497BBF749BFA1F /* RulePackTests.swift in Sources */, + 8FDF38674C022B58C5E6068F /* RuleSimulationTests.swift in Sources */, + 55FB36AE92AEF84914CCA6E8 /* RuleTemplateTests.swift in Sources */, + 2B6D1084BEC5D8FD8C1340B8 /* RuleTests.swift in Sources */, + FCD81B854E4C12AA3BE84A4D /* SettingsEnforcerTests.swift in Sources */, + 66605C2D5AE7B9D23E83AF0E /* SystemExtensionScanTests.swift in Sources */, + 255816A7B82038B2B9780E24 /* TrafficMonitorRulePackStartupTests.swift in Sources */, + E6D43A9CA39D3D205D2FD8EC /* TrafficTreePagingTests.swift in Sources */, + 8D0F2F917038A8C52AE9E271 /* UpdateTests.swift in Sources */, + 55434CF888AEE73E90EDA953 /* UpdateVerificationTests.swift in Sources */, + 41750EE3E0461E85FC71FBAF /* VersionNameRepairTests.swift in Sources */, + 593C3A02860F39DAC8019A1E /* VersionNamingRegressionTests.swift in Sources */, + 65C108E51ADCFAE65FE2C8AA /* WindowVisibilityTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BB99E7E633832FA71E20AC59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 89E518A6DD4F49D012E47AFE /* ActivityMonitor.swift in Sources */, + B1E5CA21DA13E924DD50CB51 /* AgentAttributor.swift in Sources */, + 2D10E8EE0B452C5746D2AF73 /* AgentCatalog.swift in Sources */, + 07B78C868D02BC6FB6FC561C /* AgentLauncher.swift in Sources */, + 9162E455E37916AAD651349B /* AgentPolicy.swift in Sources */, + 585CA811DBF12784CBF086EA /* AgentWorkspace.swift in Sources */, + 09B577964D76B2CCADA2E3EF /* AgentsModel.swift in Sources */, + DE40C611330AC62B7A53B63C /* AgentsView.swift in Sources */, + 65A926A0C3E7431E89CDC7FE /* AlertsView.swift in Sources */, + 70584ACFC97B4A66381BDF95 /* AnomalyEngine.swift in Sources */, + 1C837EBCE2110C53FB85C886 /* AnomalySettings.swift in Sources */, + FBE542C1BDCE771392543BD1 /* AppNavigation.swift in Sources */, + 3F09CA57A97AA100EAA0FC26 /* AppRestart.swift in Sources */, + 2A1BCAACA256067CD96D1066 /* AppleSystemApps.swift in Sources */, + 0CDAAF2B3729A02854447210 /* AskChart.swift in Sources */, + 93AC6FC795BBEAB3FCFA2C93 /* AskController.swift in Sources */, + 7BA8D2912D68E61C0523F3B6 /* AskEnvironment.swift in Sources */, + EF23A175A11656427632BE45 /* AskProvider.swift in Sources */, + CC282F84A0B0F97D5007F449 /* AskQuery.swift in Sources */, + 2AE5BF2C6ADA89975EA76B83 /* AskQueryRunner.swift in Sources */, + 8349898AD32AB76CB57C65D9 /* AskView.swift in Sources */, + 099CCC081C36710CCD4FFBD5 /* BPFProgram.swift in Sources */, + EB842377A7936B0BC9AAEC71 /* BehaviourPanel.swift in Sources */, + C5E82EFABFE12297251D924C /* BlockRules.swift in Sources */, + 046D743441B8528AD853BF2D /* BluetoothMonitor.swift in Sources */, + 1C699CA261A1C0963BF36120 /* BoundedHTTPDataTransport.swift in Sources */, + 42F74C2DB00410D8FB790B70 /* BuiltInRulePacks.swift in Sources */, + D662DA2727A039F0137E0472 /* CaptureAccess.swift in Sources */, + CDFFBF64E8D14CAB558D87F7 /* CaptureView.swift in Sources */, + 679B74263454FB76473F1006 /* CaptureWarning.swift in Sources */, + 381C9AC13AAA9CC8D1DCD8FD /* CertificateAuthority.swift in Sources */, + 028E3BA5025E1089C1CA7CEB /* CodeSignatureCheck.swift in Sources */, + BA072680D0A6AC1C40DB8608 /* Components.swift in Sources */, + BDF6030BBFAE6327B278A128 /* Constants.swift in Sources */, + E3C7DC93B1AC66ECA40B7820 /* ContentView.swift in Sources */, + EA679C463EB3158EA7195052 /* Coverage.swift in Sources */, + 4947873A05817C02C14E461D /* CoverageView.swift in Sources */, + 62ACF7BF40AB81E4CB9E4478 /* DNSParser.swift in Sources */, + 7B995B6E769204525B48DDFB /* DemoData.swift in Sources */, + 06A92144D13855A43F30221D /* DemoInspection.swift in Sources */, + D73CBA15CD6E91DE465C0556 /* DesignTokens.swift in Sources */, + 30733BCFC01E165EFF02EBA2 /* DestinationProfile.swift in Sources */, + 274EE87B6A63D7F18C0D0E1E /* DeviceModels.swift in Sources */, + CF8EE120DA5241445ECD1797 /* DeviceStore.swift in Sources */, + F782A1187A8564DA1C37EDC1 /* DevicesView.swift in Sources */, + 65F6E16AC002847C032ECC48 /* ExportController.swift in Sources */, + 3F90E760FD34949F451FBDF4 /* ExportDisclosure.swift in Sources */, + 4BAEC22536747CFB9525934A /* ExportDisclosureSheet.swift in Sources */, + 3B1CF30E04CBAAD0EC92DC5B /* ExportModels.swift in Sources */, + A78C8671BF1CC788E969814C /* ExportPayload.swift in Sources */, + C72889236AE51E71206B2F57 /* ExportQueue.swift in Sources */, + F205410D7C07CB367224D44F /* ExportSecrets.swift in Sources */, + EF8276E6A9A832CB5D74AFE3 /* ExportSettingsView.swift in Sources */, + E09B5E0093DE7BABBC1561DA /* ExtensionManager.swift in Sources */, + 2DADC58723CCECF67EAC1613 /* ExtensionRecovery.swift in Sources */, + 3607E7DD7A3ABB2C73955832 /* ExtensionTrafficSource.swift in Sources */, + 0998D0711C9591F12AE30085 /* FeatureGuide.swift in Sources */, + 78D210201D9072B255C058B1 /* FlowlightApp.swift in Sources */, + 1EC06D8718C4B684BEF492D4 /* Focus.swift in Sources */, + 0C0204670BD00994D9821D5F /* FocusView.swift in Sources */, + D5C09E269CC11D38728B69FC /* GlobMatch.swift in Sources */, + 28A7A4AF29B86B1927DBF4D3 /* Guardrail.swift in Sources */, + 7C7D39AF8E2C36BE514BF10C /* GuardrailEngine.swift in Sources */, + 7340527787A47AEDF1FE5991 /* GuardrailStore.swift in Sources */, + BF89D9E22CBBA7B5ACBD491B /* GuardrailsPane.swift in Sources */, + 06806F580BC3A25E6C76B4DE /* HTTPDataTransport.swift in Sources */, + 124C56A74E24D77F75AA8D08 /* HTTPHostParser.swift in Sources */, + A224249AD83D44E25C293EC3 /* HTTPStream.swift in Sources */, + 1438E3A19D4B0225397E92F7 /* HostCanonicalizer.swift in Sources */, + 361DD804991495DEEE15121C /* IPCProtocol.swift in Sources */, + F8E48AAE0CDB4DD16025AAEE /* IPOwnerLookup.swift in Sources */, + A6B2B75108CE6233CD3EDF00 /* InsightsModel.swift in Sources */, + A912218AF0A00A7FB4EE5221 /* InsightsPanel.swift in Sources */, + 09A86273E9179E24B619D829 /* InspectMenuItems.swift in Sources */, + BF013D373CC9FFFAD75B9C22 /* InspectView.swift in Sources */, + CA9FF629E45A3643774DDACD /* InspectionBudget.swift in Sources */, + DC86A6B4919CF1B6D72662FE /* InspectionBudgetView.swift in Sources */, + 1F1CF3F7D03FBB27616B2200 /* InspectionController.swift in Sources */, + E7F844DADB9BBF4F5A2024B6 /* InspectionProxy.swift in Sources */, + 3860DCC8B5AF2121D11144DE /* InspectionRecorder.swift in Sources */, + 216BDAB2AB83A06B61EE6325 /* InstalledApps.swift in Sources */, + 81072D7510803E8189EA2671 /* JSONTreeView.swift in Sources */, + 3C257D9C841FEE3F373EA661 /* JSONValue.swift in Sources */, + E6B53114FFB3F672BA02FE69 /* LLMFacts.swift in Sources */, + 7732BE202B8D390C8A9A0DE0 /* LLMToolCalls.swift in Sources */, + C066C0BE0A8B0C621654095F /* LiveView.swift in Sources */, + BC84D4873C2547F075562715 /* LocalRiskAnalysis.swift in Sources */, + FF4E47F54DE6A3BCFFEBAA01 /* LocalRiskSettingsSection.swift in Sources */, + 3FBACA5ECB1C08ED614FDDE7 /* LocalRiskViews.swift in Sources */, + 3DB4B694F1FBA50E559F7D9B /* Localization.swift in Sources */, + C4F66F4C8F679F53C70399D6 /* MCPAttribution.swift in Sources */, + 9A03509ED600BF1065FD2800 /* MCPDomains.swift in Sources */, + E4D30933B930F00B7CAADE20 /* MCPDomainsSection.swift in Sources */, + 27B5D51389021FC95AAB2530 /* MockGate.swift in Sources */, + 8A5E37FB8BB6623CEF21420D /* MockRule.swift in Sources */, + 239189796A5B358CF23BFCF9 /* MockRulesView.swift in Sources */, + 36F61F7BAE54F429B4C19D22 /* Motion.swift in Sources */, + D77B6BB95661074A90B12EE7 /* NettopParser.swift in Sources */, + E844FB53C6EA5C8BF5F37849 /* NettopTrafficSource.swift in Sources */, + B5614834E9118B531713207A /* NetworkChannel.swift in Sources */, + 09F9A2B71C1F7867CB04DDAC /* NetworkScope.swift in Sources */, + 780A2B3FCEDB696FC8FBD4AF /* Notifier.swift in Sources */, + D9987CC20EB70831208A0430 /* OnDeviceAsk.swift in Sources */, + 6514A22112924B2965D507DE /* OnDeviceRiskProvider.swift in Sources */, + B88D4DE798915EA469DF73B3 /* PacketSniffer.swift in Sources */, + 64D1D0E76973447B888270C1 /* PluginEngine.swift in Sources */, + 7F2257D0029DC85A25033B9B /* PluginModels.swift in Sources */, + FF4E8EC8F36613C1C03549AE /* PluginPackageVerifier.swift in Sources */, + DEDCFC43A3BBD2E91277302F /* PluginScriptRunner.swift in Sources */, + DC7F897C9C4E1E353F05E3A5 /* PluginSettingsView.swift in Sources */, + C6B736C06DB70C19217FA5AE /* PluginStore.swift in Sources */, + A4CEEDBC97449B58C674CD4F /* ProcessLookup.swift in Sources */, + 155D31587F84936506FDEBB2 /* ProcessNaming.swift in Sources */, + 61648ED4A0DBCEC775673448 /* ProtocolCatalog.swift in Sources */, + 0D37699776684FD04F8D9D07 /* ProtocolClassifier.swift in Sources */, + 2D89FAAC905437BEC596808B /* ProxyJanitor.swift in Sources */, + B4C83BAE6447273B72D237AB /* ProxyRelaunch.swift in Sources */, + 3E591F9FC749BBE46FE5C100 /* RemoteAsk.swift in Sources */, + DDC032E6272181F3E1B1BB4F /* ReportsView.swift in Sources */, + 59D83ED863E01486B578B923 /* ResponseGate.swift in Sources */, + B5E88F4AF351CB717C46B22E /* ResponseScriptRunner.swift in Sources */, + 705BEA6B331562969B8FCD26 /* ResponseTransformRule.swift in Sources */, + 9814BB05A2FC8648EB62145C /* ResponseTransformRulesView.swift in Sources */, + E12E137A657C739019D6F4D3 /* RewriteRule.swift in Sources */, + 50CD7EF8F4121F7DD1C65680 /* RewriteRulesView.swift in Sources */, + 32FCEAF70EBFB57EA5579E96 /* Rule.swift in Sources */, + 5E22345FC07C19F4A32C5002 /* RuleEditor.swift in Sources */, + F842F0968BAFF7623B4A86BE /* RulePack.swift in Sources */, + 21D7D0DF6C5DF97EB3D1EFD9 /* RulePackCatalogComposition.swift in Sources */, + 603AE25B0614892F454FE15B /* RulePackCatalogState.swift in Sources */, + E16E772F86A6469231B18EB2 /* RulePackCatalogUpdater.swift in Sources */, + A8347F99B5A1857DDF39D56F /* RulePackCatalogVerifier.swift in Sources */, + 5D637AB4C3D308EAC8CC9448 /* RulePackDeliveryStats.swift in Sources */, + 739AA7451B3E61F2963C3237 /* RulePackEditorDraft.swift in Sources */, + 26D43E956CC67CECE784EF26 /* RulePackEventDelivery.swift in Sources */, + FEE9F18D463C7060E835F757 /* RulePackSimulation.swift in Sources */, + EDAB8186A2117A6EE711A8B9 /* RulePackStore.swift in Sources */, + 2F2E867F1E599C48EC6DE525 /* RulePackTransfer.swift in Sources */, + 78FD830C8350A22AD11723EC /* RulePacksView.swift in Sources */, + AC5E1A01FEBC6A4C9951353E /* RuleSimulation.swift in Sources */, + 597FCA0655D52D801C0542F4 /* RuleSimulationView.swift in Sources */, + 5A58E6A00FD4F35DA506B390 /* RuleStore.swift in Sources */, + 362251769AB9DAC1BF063FD0 /* RuleTemplates.swift in Sources */, + 0BC685F72E943E55AA0DFC1A /* RulesView.swift in Sources */, + C9F9F6FF27500A2CB5BE992B /* SQLite.swift in Sources */, + B8B770675C09113D28BDF3F1 /* SettingsEnforcer.swift in Sources */, + F5AE32D382E6DDD1B06783B8 /* SettingsView.swift in Sources */, + 846FECA436B94D952C489DEE /* SharedStrings.swift in Sources */, + 939DB311C31E0F1B33583B8A /* SystemExtensionScan.swift in Sources */, + 149824D7E5DBBF87A16CFBDB /* TLSSNIParser.swift in Sources */, + 8B41FBD2537503B964EC5C81 /* ToolActivity.swift in Sources */, + CF9E8E6FBFB1D1DBD7610DA1 /* ToolCallLinks.swift in Sources */, + 3BB8B3792AD8FFCDE2B0897A /* ToolResults.swift in Sources */, + EFBA053570FE24748547DDB2 /* TrafficDatabase.swift in Sources */, + 8F7C96FA3DFC112A72976562 /* TrafficModels.swift in Sources */, + 4EF5727ADC37F80E20EF4327 /* TrafficMonitor.swift in Sources */, + D698B39BD305EC2E4168B923 /* TrafficSource.swift in Sources */, + C094B24A112FF0FE00623E9F /* TrafficTree.swift in Sources */, + 88B1D1AFC30EEFB351A2D10F /* USBMonitor.swift in Sources */, + D30A985B88E65A6F89E9E7E7 /* UpdateChecker.swift in Sources */, + DB969099AF17B4E0DBA3034C /* UpdateInstaller.swift in Sources */, + 9BE0BB0A6D132461427E755B /* UpdateView.swift in Sources */, + C62FF7278DAD93AB68B2FFF1 /* WindowVisibility.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D08D03E8FB49A5314F071BB1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 813089B6205B28E82D260539 /* AgentCatalog.swift in Sources */, + C05C1729B55B00FC0AF1C20C /* AgentLauncher.swift in Sources */, + 3A12FB5ECC1D6C88CE759CFC /* AgentPolicy.swift in Sources */, + EA73DD364261DB7A3860FCF1 /* AppleSystemApps.swift in Sources */, + F2304F128BB915C60307AD44 /* BlockEnforcer.swift in Sources */, + 37BAEA33191AFCF7EED18540 /* BlockRules.swift in Sources */, + 56AE97B7A55B1A70250CAA57 /* Constants.swift in Sources */, + 18F94A8B0CE6DD3B1714C5DC /* DNSParser.swift in Sources */, + 8D0ECCF27AEAA38CE6E939B0 /* FilterDataProvider.swift in Sources */, + C030AD2D9C98160C80D356AD /* FlowTracker.swift in Sources */, + 0BB12E96D54D92C8D24619B5 /* GlobMatch.swift in Sources */, + CAFBA60EFEF3BB7D4F8D38E9 /* Guardrail.swift in Sources */, + FECA6CBE50938E777E17D87D /* HTTPHostParser.swift in Sources */, + 2F805A324684FF8CB7E0297B /* HostCanonicalizer.swift in Sources */, + D6DB988F5D1D2A3C2A5753E5 /* IPCProtocol.swift in Sources */, + 0D622C67AB136A6F14708CA6 /* IPCServer.swift in Sources */, + 3E265CB16F7C94A36ED3D11E /* NetworkChannel.swift in Sources */, + 65F285392A51B100F8FD2BBA /* NetworkScope.swift in Sources */, + DBC04B2A1B129C44A3D8A40D /* ProcessNaming.swift in Sources */, + 2560A34A00122DEF53A1C407 /* ProcessResolver.swift in Sources */, + 77E90A284280B87F30A30487 /* ProtocolCatalog.swift in Sources */, + E88DD26D7D2E9C0E0FBACD6F /* ProtocolClassifier.swift in Sources */, + F26718FE423FEE15B5502B8A /* Rule.swift in Sources */, + A147D607E84B5B0B102C824A /* RulePack.swift in Sources */, + 83E9F19608C25B32DF8C52AB /* RulePackSimulation.swift in Sources */, + 969FC166DAA7623081DA7392 /* RulePackTransfer.swift in Sources */, + FC820F255E16C392B007726B /* RuleSimulation.swift in Sources */, + 6C3AC854882827BEA6A2B9CB /* TLSSNIParser.swift in Sources */, + 87B80FD11BAC558198442507 /* TrafficModels.swift in Sources */, + ED2148A66082B969315461CA /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F4C8991BC53B54019DDD0015 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D30F3B5A02E089EEADBDE98B /* ActivityMonitor.swift in Sources */, + C35F10A4B87D29525A740DD5 /* AgentAttributor.swift in Sources */, + DDE2B0B0A807C428B9F78120 /* AgentCatalog.swift in Sources */, + 63CBA5AACC00FC44C982ADAF /* AgentLauncher.swift in Sources */, + 9767A4CE180F4083B693CC19 /* AgentPolicy.swift in Sources */, + 120C7E644032F70B351DB87E /* AgentWorkspace.swift in Sources */, + 89B09C7F77A5D116433291C5 /* AgentsModel.swift in Sources */, + 807AB517A5ED9EE6738FD707 /* AgentsView.swift in Sources */, + 41033D5CF2A9446276DADB97 /* AlertsView.swift in Sources */, + C7798BE6AE9C79EB8BA3576C /* AnomalyEngine.swift in Sources */, + 268A7C1C22F1C06F7B6DA52C /* AnomalySettings.swift in Sources */, + 953BF001428B13E4B3B04D4C /* AppNavigation.swift in Sources */, + 7E1481BA85DDCD19B4972B99 /* AppRestart.swift in Sources */, + 4A0EDDA9455A32B4A43F42FF /* AppleSystemApps.swift in Sources */, + 4453A6861DA4D5A8AE3CC793 /* AskChart.swift in Sources */, + 875CEAD8A14432BD5E46F0DF /* AskController.swift in Sources */, + EEA0FEAC3D3CA9C73393EF3E /* AskEnvironment.swift in Sources */, + 858D19CFF01AFC9E3FF8F364 /* AskProvider.swift in Sources */, + B4A39C2F0D1B775D59ADC50C /* AskQuery.swift in Sources */, + 3900BC10AB6AE27C341962CE /* AskQueryRunner.swift in Sources */, + F47E13AFAFF872BB15EA4E59 /* AskView.swift in Sources */, + 3C3AAF8E67A81B9447144BE2 /* BPFProgram.swift in Sources */, + 8BE14301F6CA5DEF8209A4FC /* BehaviourPanel.swift in Sources */, + C5077734C82AD352CC3EFA5C /* BlockRules.swift in Sources */, + 5AA48BB88F9E0F6F858DC553 /* BluetoothMonitor.swift in Sources */, + 1D11256FDE7183EBBED5D308 /* BoundedHTTPDataTransport.swift in Sources */, + C513F5D1936E202D0D6ECEFD /* BuiltInRulePacks.swift in Sources */, + 7FBA685D695EA14B08E9F18A /* CaptureAccess.swift in Sources */, + D3EB4913132CAEA7FA827B08 /* CaptureView.swift in Sources */, + A7369F9D640FCFDAC459E5F6 /* CaptureWarning.swift in Sources */, + 2E110029B0BE1C39A967E0CA /* CertificateAuthority.swift in Sources */, + EDEAECD3FA4B513114C0B581 /* CodeSignatureCheck.swift in Sources */, + 6FC332766A183D00E84656E3 /* Components.swift in Sources */, + 7726A81EF6802B2BC4606540 /* Constants.swift in Sources */, + 80FA6E238AC7FDEE36C05B5C /* ContentView.swift in Sources */, + 87F047938C7E5461658F8CE3 /* Coverage.swift in Sources */, + A108B205EE74FC1ADD45FD9E /* CoverageView.swift in Sources */, + 280B869A858715537934AC50 /* DNSParser.swift in Sources */, + 83B35B9C8D236EA11ED27A43 /* DemoData.swift in Sources */, + 6464CE699E3EE225BA57C0EF /* DemoInspection.swift in Sources */, + 742203151D5AF7CC2A2C1440 /* DesignTokens.swift in Sources */, + DB09CEC00A661AF26C37244E /* DestinationProfile.swift in Sources */, + 10776A2B276E82BD07243E07 /* DeviceModels.swift in Sources */, + 315C5531C14F1DDE99043A18 /* DeviceStore.swift in Sources */, + 70CD0A27AAF526B9BB07BBAE /* DevicesView.swift in Sources */, + 9DA5CB6639FF673FC53D033A /* ExportController.swift in Sources */, + 0567566CCFA1B23855C3C0F1 /* ExportDisclosure.swift in Sources */, + C49DD542101E64D0EEBD05E4 /* ExportDisclosureSheet.swift in Sources */, + E25A53EA4362FCC71BCE5A80 /* ExportModels.swift in Sources */, + 653556BA776A6E7755D3DD53 /* ExportPayload.swift in Sources */, + A3417EC0EF2DD2A4D35CAAB5 /* ExportQueue.swift in Sources */, + C7FAFFB62ADB58699720440A /* ExportSecrets.swift in Sources */, + 84E8F07CBD455A23EE2DF978 /* ExportSettingsView.swift in Sources */, + F5F925E03C86F8B023DC788D /* ExtensionManager.swift in Sources */, + BB4533F39F79A5D13D438C34 /* ExtensionRecovery.swift in Sources */, + A48DC12BB97A0E5499A3D87D /* ExtensionTrafficSource.swift in Sources */, + 22B534F23EF9F05AE27A6D71 /* FeatureGuide.swift in Sources */, + 451AB2522DC0E73CF1301EE1 /* FlowlightApp.swift in Sources */, + 27DC00A62F0BCEE6B1FC2B07 /* Focus.swift in Sources */, + 4D676BCFC2B27CB77015BDFA /* FocusView.swift in Sources */, + 118B4F7C72898BC0091B8F6A /* GlobMatch.swift in Sources */, + 48170BB139B744FAD6513959 /* Guardrail.swift in Sources */, + 1203A91F64B3D15431700D4F /* GuardrailEngine.swift in Sources */, + B0140F7BF021D067E67BF817 /* GuardrailStore.swift in Sources */, + 51694FE8AB65C2BC3BD5B21D /* GuardrailsPane.swift in Sources */, + 3A195005D8A4580FADEC59A9 /* HTTPDataTransport.swift in Sources */, + 4C028FF54CB024B6DAEA2DBA /* HTTPHostParser.swift in Sources */, + DED507EF1A36E9B66FE4512E /* HTTPStream.swift in Sources */, + D10DE307D1AD32A7D8173A41 /* HostCanonicalizer.swift in Sources */, + 5A2A8DF18D3C1FC584DAFBEB /* IPCProtocol.swift in Sources */, + B80FC9A3A8F21AFFCF5149A9 /* IPOwnerLookup.swift in Sources */, + 145E54492C15FDD359B6DB08 /* InsightsModel.swift in Sources */, + A3FF156082D5E00D561A7099 /* InsightsPanel.swift in Sources */, + E00C03B4955BFBA626340B5C /* InspectMenuItems.swift in Sources */, + E592D3A1D73A580676FA5696 /* InspectView.swift in Sources */, + 2504E2CFD3C6AFA86FDC86D3 /* InspectionBudget.swift in Sources */, + 042EE0F6F95E5432AB027C65 /* InspectionBudgetView.swift in Sources */, + 0D7D15BD7081161D53ED1578 /* InspectionController.swift in Sources */, + AF8A26B4F8FFA3C94F0D276E /* InspectionProxy.swift in Sources */, + FE3B0FCAFA812B5CEA810488 /* InspectionRecorder.swift in Sources */, + C558099602CDA3A231384EBD /* InstalledApps.swift in Sources */, + E15272D4731FBF6CB1126495 /* JSONTreeView.swift in Sources */, + A9675AD6413CA1740A75CE8F /* JSONValue.swift in Sources */, + AD57CBF846824C0BE9878BF1 /* LLMFacts.swift in Sources */, + 3144B2FBE6DEA543CA36D1CD /* LLMToolCalls.swift in Sources */, + 3FE68A4EC4BEA3A2B81D069E /* LiveView.swift in Sources */, + F9429DCDFAEE199D6635BA33 /* LocalRiskAnalysis.swift in Sources */, + 43329736A36E1C4367881E40 /* LocalRiskSettingsSection.swift in Sources */, + 4B0B6CA666157D7B72A8F511 /* LocalRiskViews.swift in Sources */, + 52A067CD50920CBDEC98A32F /* Localization.swift in Sources */, + 48330DCACD790F31E072D0B3 /* MCPAttribution.swift in Sources */, + 094C8F94FD053B615836D494 /* MCPDomains.swift in Sources */, + D58E19691840000472807F80 /* MCPDomainsSection.swift in Sources */, + BD91747457B98A2408D1977D /* MockGate.swift in Sources */, + AF9E41AC8E40F018E642A73E /* MockRule.swift in Sources */, + CB731DCD258C0048C4FECDF2 /* MockRulesView.swift in Sources */, + 42E39E8ADC51DA39DE0784AD /* Motion.swift in Sources */, + D688BB9313DA940E107D8237 /* NettopParser.swift in Sources */, + 643D3B8316459A2CEFBA261F /* NettopTrafficSource.swift in Sources */, + C456CD5C4C3C603419925D58 /* NetworkChannel.swift in Sources */, + 4767B9EBDCBFD6B3483079B2 /* NetworkScope.swift in Sources */, + 97CE90F39AE2FC5B9E0AD84C /* Notifier.swift in Sources */, + 35B3F93219A8854FFF1D3EEF /* OnDeviceAsk.swift in Sources */, + 6794B84FCA2A7991AD670BDA /* OnDeviceRiskProvider.swift in Sources */, + EDB017EC114FFAF18CEC2786 /* PacketSniffer.swift in Sources */, + 623C50C16EB5A7DCA225F775 /* PluginEngine.swift in Sources */, + 631C449B074FB7E31D887EFC /* PluginModels.swift in Sources */, + 4323C68638C74F3E8D02FA65 /* PluginPackageVerifier.swift in Sources */, + 58EB211C6C5B91A0435C5E11 /* PluginScriptRunner.swift in Sources */, + 931D85D9291D5E557B69BD43 /* PluginSettingsView.swift in Sources */, + A8869D4F16D83EC7120D901E /* PluginStore.swift in Sources */, + BA5C8DE36B0484931B6652E0 /* ProcessLookup.swift in Sources */, + 850653E102AF3CD2C3833524 /* ProcessNaming.swift in Sources */, + CAE2EEC350E48F001B343DE1 /* ProtocolCatalog.swift in Sources */, + 0ACF3321E6670591EC9B1306 /* ProtocolClassifier.swift in Sources */, + AF1BB39DC13C09CAC6253943 /* ProxyJanitor.swift in Sources */, + 3654D301BB54F59D172A1668 /* ProxyRelaunch.swift in Sources */, + 6BE9B797667820AD0E72D789 /* RemoteAsk.swift in Sources */, + F75EB274ED11E8E4225746B2 /* ReportsView.swift in Sources */, + 47F1C0E114B1AFD567C42792 /* ResponseGate.swift in Sources */, + E69786240DE2CC058F7A307A /* ResponseScriptRunner.swift in Sources */, + 897D75C0AEE76F10ADF0CD5C /* ResponseTransformRule.swift in Sources */, + CE0458FD46CC7EF3A1379B53 /* ResponseTransformRulesView.swift in Sources */, + 46E686B76B70B444AA375FBC /* RewriteRule.swift in Sources */, + FF59AD47E15AFE192913C918 /* RewriteRulesView.swift in Sources */, + CE1589D1A40B2EC1084C7A88 /* Rule.swift in Sources */, + 23CC0B3EE557E6F247EC4100 /* RuleEditor.swift in Sources */, + CF2049DA978EB9588596556F /* RulePack.swift in Sources */, + E5973D84F73F277220538694 /* RulePackCatalogComposition.swift in Sources */, + 6C42E5ECB1F31F42DDD421F7 /* RulePackCatalogState.swift in Sources */, + 574A061E9456AD6BD7E3AB5A /* RulePackCatalogUpdater.swift in Sources */, + 62885CD8C265122129AF78FF /* RulePackCatalogVerifier.swift in Sources */, + B1DCF272AD61D6284A4D63BD /* RulePackDeliveryStats.swift in Sources */, + 2497E16386CDFE769EFB0EF6 /* RulePackEditorDraft.swift in Sources */, + 290D1B10464B9915C1505610 /* RulePackEventDelivery.swift in Sources */, + E0C3CC3AA91B74C0D98ACE5F /* RulePackSimulation.swift in Sources */, + CF16C383C4E52E86951F7B17 /* RulePackStore.swift in Sources */, + 836D7B339C78B6FC98DD5AA8 /* RulePackTransfer.swift in Sources */, + C7B4D535CFF9FA9D0DE8D708 /* RulePacksView.swift in Sources */, + 72410A21824E39F8FF1854A3 /* RuleSimulation.swift in Sources */, + D4B24A76368B295B8DE8EC0B /* RuleSimulationView.swift in Sources */, + 67F5BAFB0D59F3692C418D0C /* RuleStore.swift in Sources */, + F130AF6A964F77EF85EBB32D /* RuleTemplates.swift in Sources */, + 14ACBD3AE23905CA5DA965CB /* RulesView.swift in Sources */, + 65DE86F9DCCC5A1293FC29E2 /* SQLite.swift in Sources */, + 80D7CBA2AE6B117ACC0BE7BB /* SettingsEnforcer.swift in Sources */, + 8DAA531E3904A7B356FE2B77 /* SettingsView.swift in Sources */, + 8B74946210FB3616E1F4ACD1 /* SharedStrings.swift in Sources */, + EF884A8D586CA5022C4DD01B /* SystemExtensionScan.swift in Sources */, + 2F80C3268E914A2041232706 /* TLSSNIParser.swift in Sources */, + 0B9096994698EFB06A95D26D /* ToolActivity.swift in Sources */, + C9E61A29C4EA61E978DF7C1A /* ToolCallLinks.swift in Sources */, + 4B7736E9D3BEAB93A4AA8B4E /* ToolResults.swift in Sources */, + DF8776D774DE087DBBFB257F /* TrafficDatabase.swift in Sources */, + 03861BEFD76EF771618B928F /* TrafficModels.swift in Sources */, + B3D4CAEA3D9EB39E1B7BCBA7 /* TrafficMonitor.swift in Sources */, + 7D613ABDA5085E4150738DA6 /* TrafficSource.swift in Sources */, + 7BE6EA58391841D37FB1117F /* TrafficTree.swift in Sources */, + 93AE87F6497373A647A92DD4 /* USBMonitor.swift in Sources */, + DFC721C64B216FEB81C55917 /* UpdateChecker.swift in Sources */, + A1DE70B1FFF145A8057E85C4 /* UpdateInstaller.swift in Sources */, + 8D660394CF2B20BC98E53675 /* UpdateView.swift in Sources */, + 05D3F9927B8A2B6F4D3CC93C /* WindowVisibility.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0945A62A6C0D7F91032CFD50 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 36B21D467163CD9F57115778 /* FlowlightResponseScriptHelper */; + targetProxy = 8E69049BBCF586A050AA927F /* PBXContainerItemProxy */; + }; + 531D8A14230A1D40ACDD824B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1C9BF0C33D1912981FB4B5AD /* Flowlight */; + targetProxy = 7C42FA3A564662B5DB0FD5BF /* PBXContainerItemProxy */; + }; + CBC6CA3966123861544E6E1F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 94D00543044D9B601CDCA877 /* FlowlightExtension */; + targetProxy = 8F920FDBFA157B736CCD7ECE /* PBXContainerItemProxy */; + }; + ECC654C18DFE8F2D4FE918A4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 904DAC0BB81071A09FF1A5B0 /* FlowlightStoreExtension */; + targetProxy = A212C96A4D9348FC9F87A9EA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 77D58ED5F4678FC1C2A5634A /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 077EA8EE506D61EC90E4411E /* de */, + 0599916780428125A134B249 /* en */, + 7075FF219DB5D21F32149FE5 /* es */, + EC292A1F1020AAA580DA3CDB /* fr */, + 1D0AA61D989998AB7A90CDDB /* it */, + 9970A61AD194525C58096029 /* ja */, + B545B09C3EE58C355E7D048A /* ko */, + 1C63D0070EAC9A8146D63ABD /* pt-PT */, + 62444723DE772055CA79A923 /* zh-Hans */, + AF8F5D7CBCD592768D4C3F2E /* zh-Hant */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0B4E4BC53709054EB9EDCBAF /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = FlowlightExtension/FlowlightExtension.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = FlowlightExtension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_EXT_PROFILE)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = AppStore; + }; + 0CB4AC86125929DEE6BFCBA3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = FlowlightExtension/FlowlightExtension.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = FlowlightExtension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_EXT_PROFILE)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 2BA4D1560ECB8CD40C5DB361 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "Flowlight/Flowlight-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = AppStore; + }; + 3ED55A66D80AB5682CABEB3C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 51; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 0.15.6; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 3F7729973334863819D4A284 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 51; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 38RJUJHKZS; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 0.15.6; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + }; + name = AppStore; + }; + 532DCA2CF4D443B8A0124ECE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Flowlight/Flowlight.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_APP_PROFILE)"; + SDKROOT = macosx; + }; + name = Release; + }; + 555311EB7E3588CBED9AD438 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 51; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 0.15.6; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 59D8FF91B8AD2C705CDDAC5E /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.tests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flowlight.app/Contents/MacOS/Flowlight"; + }; + name = AppStore; + }; + 5DBD3E9CE3B414BC7FEEB00E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Flowlight/Flowlight.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_APP_PROFILE)"; + SDKROOT = macosx; + }; + name = Debug; + }; + 745FC642D34466CA97B01B26 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "FlowlightExtension/FlowlightExtension-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "FlowlightExtension/Info-AppStore.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = Release; + }; + 7B63A17199D52F8B6039FF81 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.tests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flowlight.app/Contents/MacOS/Flowlight"; + }; + name = Release; + }; + 82A2F2D87C1F408C546D371E /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Flowlight/Flowlight.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_APP_PROFILE)"; + SDKROOT = macosx; + }; + name = AppStore; + }; + 8DE6CC23E67C44FB5A4DFE4E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "Flowlight/Flowlight-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = Release; + }; + 9456127BB85B5DFEA0196234 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "FlowlightExtension/FlowlightExtension-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "FlowlightExtension/Info-AppStore.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = Debug; + }; + 98278C91D8AA57F268A040BA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.tests; + SDKROOT = macosx; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flowlight.app/Contents/MacOS/Flowlight"; + }; + name = Debug; + }; + A806300B0CAD7CC42ED5F904 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = FlowlightExtension/FlowlightExtension.entitlements; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = FlowlightExtension/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + PROVISIONING_PROFILE_SPECIFIER = "$(FL_EXT_PROFILE)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + ADBBC4464F6E91D8258DD00A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.FlowlightResponseScriptHelper; + PRODUCT_NAME = FlowlightResponseScriptHelper; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + CAD52FE1B16C85FE2E4B8081 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.FlowlightResponseScriptHelper; + PRODUCT_NAME = FlowlightResponseScriptHelper; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + D6B73476179B6ECC0E8FF0AC /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "FlowlightExtension/FlowlightExtension-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "FlowlightExtension/Info-AppStore.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app.filter; + PRODUCT_NAME = com.flowlight.app.filter; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = AppStore; + }; + E49C0C89C2E9D3324293BA12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = "Flowlight/Flowlight-AppStore.entitlements"; + COMBINE_HIDPI_IMAGES = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = Flowlight/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.app; + PRODUCT_NAME = Flowlight; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; + }; + name = Debug; + }; + E89D09DB0A0881E3F0A59071 /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.flowlight.FlowlightResponseScriptHelper; + PRODUCT_NAME = FlowlightResponseScriptHelper; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = AppStore; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0F10D312DC2BCA5C48705215 /* Build configuration list for PBXNativeTarget "FlowlightAppStore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BA4D1560ECB8CD40C5DB361 /* AppStore */, + E49C0C89C2E9D3324293BA12 /* Debug */, + 8DE6CC23E67C44FB5A4DFE4E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + 33A9FF4B8D9B2D5D15133A18 /* Build configuration list for PBXNativeTarget "FlowlightResponseScriptHelper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E89D09DB0A0881E3F0A59071 /* AppStore */, + CAD52FE1B16C85FE2E4B8081 /* Debug */, + ADBBC4464F6E91D8258DD00A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + 4A74C79A97028F05EA626F95 /* Build configuration list for PBXNativeTarget "Flowlight" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 82A2F2D87C1F408C546D371E /* AppStore */, + 5DBD3E9CE3B414BC7FEEB00E /* Debug */, + 532DCA2CF4D443B8A0124ECE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + 6C5A1D60ED3AC8932FFE1FB1 /* Build configuration list for PBXNativeTarget "FlowlightExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0B4E4BC53709054EB9EDCBAF /* AppStore */, + 0CB4AC86125929DEE6BFCBA3 /* Debug */, + A806300B0CAD7CC42ED5F904 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + 6D4671AC947DCF84267F4477 /* Build configuration list for PBXNativeTarget "FlowlightTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 59D8FF91B8AD2C705CDDAC5E /* AppStore */, + 98278C91D8AA57F268A040BA /* Debug */, + 7B63A17199D52F8B6039FF81 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + CA490C327FA0F549ADD0301B /* Build configuration list for PBXProject "Flowlight" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3F7729973334863819D4A284 /* AppStore */, + 555311EB7E3588CBED9AD438 /* Debug */, + 3ED55A66D80AB5682CABEB3C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; + D76A79764257B12EB4B0EB70 /* Build configuration list for PBXNativeTarget "FlowlightStoreExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D6B73476179B6ECC0E8FF0AC /* AppStore */, + 9456127BB85B5DFEA0196234 /* Debug */, + 745FC642D34466CA97B01B26 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = AppStore; + }; +/* End XCConfigurationList section */ + }; + rootObject = 27052BCDFA1783A148CD45FD /* Project object */; +} diff --git a/Flowlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Flowlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Flowlight.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight App Store.xcscheme b/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight App Store.xcscheme new file mode 100644 index 00000000..382dcac4 --- /dev/null +++ b/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight App Store.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight.xcscheme b/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight.xcscheme new file mode 100644 index 00000000..5d3375ab --- /dev/null +++ b/Flowlight.xcodeproj/xcshareddata/xcschemes/Flowlight.xcscheme @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 3e4f01a1..42f2f0fd 100644 --- a/README.md +++ b/README.md @@ -352,7 +352,8 @@ same local database. ```sh brew install xcodegen git clone https://github.com/xinbetween/flowlight.git && cd flowlight -xcodegen generate +scripts/check_xcode_project.sh --write # regenerate the committed shared Xcode project +scripts/check_xcode_project.sh # verify it still matches project.yml scripts/build-local.sh # ad-hoc signed, no Apple account needed open build/Build/Products/Release/Flowlight.app scripts/build-dmg.sh # optional: drag-to-install disk image (build/Flowlight.dmg) diff --git a/docs/404.html b/docs/404.html index fd3eef98..2c7f8501 100644 --- a/docs/404.html +++ b/docs/404.html @@ -86,7 +86,7 @@

That page isn't here

Try the home page,

diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index ba3be94a..a8e01557 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -5,7 +5,8 @@ Internals, build options and the Network Extension path. For an overview, see th ## Layout ``` -project.yml XcodeGen spec (run `xcodegen generate` to regenerate the .xcodeproj) +project.yml XcodeGen source of truth +Flowlight.xcodeproj/ Committed shared output so Xcode Cloud can discover the project before build scripts run Shared/ Compiled into both targets TrafficModels.swift FlowKey (pid, bundle, ip, domain, port, protocol) → bytes in/out, flows IPCProtocol.swift XPC contract between the extension and the app @@ -79,6 +80,11 @@ TEAM_ID=ABCDE12345 scripts/build-signed.sh Run the tests with `xcodebuild -scheme Flowlight test CODE_SIGN_IDENTITY=- CODE_SIGN_ENTITLEMENTS= DEVELOPMENT_TEAM=`. +`project.yml` remains the editable project definition. After changing it, run +`scripts/check_xcode_project.sh --write`, verify with `scripts/check_xcode_project.sh`, and commit the four shared files under +`Flowlight.xcodeproj/`. The generated project is deliberately committed because Xcode Cloud must find its selected +container before a post-clone script can run. User data and Xcode Cloud's local manifest remain ignored. + **If the checkout is under `~/Desktop`, `~/Documents` or `~/Downloads`, two tests will hang for two minutes each and the run will fail.** `HelpTests` reads the built `docs/docs/index.html` to check that every screen's Help anchor exists, and macOS asks for consent before the test host may read those folders — with nobody there diff --git a/docs/about/index.html b/docs/about/index.html index 20d3739e..b152f6fc 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -153,7 +153,7 @@

Thanks

diff --git a/docs/de/about/index.html b/docs/de/about/index.html index 35097033..1581c478 100644 --- a/docs/de/about/index.html +++ b/docs/de/about/index.html @@ -152,7 +152,7 @@

Dank

diff --git a/docs/de/docs/index.html b/docs/de/docs/index.html index da801b39..2f948636 100644 --- a/docs/de/docs/index.html +++ b/docs/de/docs/index.html @@ -76,7 +76,7 @@

Dokumentation

Flowlight benutzen

-

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.15.5, macOS 15 oder neuer.

+

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.15.6, macOS 15 oder neuer.

diff --git a/docs/de/index.html b/docs/de/index.html index ff75d1b5..2aba175d 100644 --- a/docs/de/index.html +++ b/docs/de/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Sieh, was deine Apps im Netz tun.
brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniversalGPL-3.0Keine Telemetrie

+

v0.15.6macOS 15+UniversalGPL-3.0Keine Telemetrie

@@ -572,7 +572,7 @@

Wisse, was deinen Mac verlässt.

diff --git a/docs/de/privacy/index.html b/docs/de/privacy/index.html index ce975f2a..d4b13278 100644 --- a/docs/de/privacy/index.html +++ b/docs/de/privacy/index.html @@ -189,7 +189,7 @@

Kontakt

diff --git a/docs/de/threat-model/index.html b/docs/de/threat-model/index.html index 20d0e5b6..4a4bf1ed 100644 --- a/docs/de/threat-model/index.html +++ b/docs/de/threat-model/index.html @@ -225,7 +225,7 @@

Eine Schwachstelle melden

diff --git a/docs/docs/index.html b/docs/docs/index.html index 447fcea9..1c2691a7 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -76,7 +76,7 @@

Documentation

Using Flowlight

-

Everything from the first launch to tuning the agent rules. Flowlight 0.15.5, macOS 15 or later.

+

Everything from the first launch to tuning the agent rules. Flowlight 0.15.6, macOS 15 or later.

diff --git a/docs/es/about/index.html b/docs/es/about/index.html index bc1eb62c..f42bf604 100644 --- a/docs/es/about/index.html +++ b/docs/es/about/index.html @@ -152,7 +152,7 @@

Agradecimientos

diff --git a/docs/es/docs/index.html b/docs/es/docs/index.html index efab8a09..2dee3612 100644 --- a/docs/es/docs/index.html +++ b/docs/es/docs/index.html @@ -76,7 +76,7 @@

Documentación

Usar Flowlight

-

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.15.5, macOS 15 o posterior.

+

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.15.6, macOS 15 o posterior.

diff --git a/docs/es/index.html b/docs/es/index.html index 6bd350e4..73330a5a 100644 --- a/docs/es/index.html +++ b/docs/es/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Observa la actividad de red de tus apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniversalGPL-3.0Sin telemetría

+

v0.15.6macOS 15+UniversalGPL-3.0Sin telemetría

@@ -572,7 +572,7 @@

Ten claro qué sale de tu Mac.

diff --git a/docs/es/privacy/index.html b/docs/es/privacy/index.html index db5cb6d5..8f3b9a53 100644 --- a/docs/es/privacy/index.html +++ b/docs/es/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/es/threat-model/index.html b/docs/es/threat-model/index.html index 9d30869d..ae84a020 100644 --- a/docs/es/threat-model/index.html +++ b/docs/es/threat-model/index.html @@ -221,7 +221,7 @@

Informar de una vulnerabilidad

diff --git a/docs/fr/about/index.html b/docs/fr/about/index.html index 3422fc68..5f82f33f 100644 --- a/docs/fr/about/index.html +++ b/docs/fr/about/index.html @@ -152,7 +152,7 @@

Remerciements

diff --git a/docs/fr/docs/index.html b/docs/fr/docs/index.html index 9e9b6b7c..0e1d2c57 100644 --- a/docs/fr/docs/index.html +++ b/docs/fr/docs/index.html @@ -76,7 +76,7 @@

Documentation

Utiliser Flowlight

-

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.15.5, macOS 15 ou version ultérieure.

+

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.15.6, macOS 15 ou version ultérieure.

diff --git a/docs/fr/index.html b/docs/fr/index.html index fc3dda28..72cc83be 100644 --- a/docs/fr/index.html +++ b/docs/fr/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Voyez l’activité réseau de vos apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniverselGPL-3.0Sans télémétrie

+

v0.15.6macOS 15+UniverselGPL-3.0Sans télémétrie

@@ -572,7 +572,7 @@

Sachez ce qui quitte votre Mac.

diff --git a/docs/fr/privacy/index.html b/docs/fr/privacy/index.html index ebbf5a25..a2afc061 100644 --- a/docs/fr/privacy/index.html +++ b/docs/fr/privacy/index.html @@ -189,7 +189,7 @@

Contact

diff --git a/docs/fr/threat-model/index.html b/docs/fr/threat-model/index.html index dcf1a52f..9d2a6c7e 100644 --- a/docs/fr/threat-model/index.html +++ b/docs/fr/threat-model/index.html @@ -224,7 +224,7 @@

Signaler une vulnérabilité

diff --git a/docs/index.html b/docs/index.html index f921ef65..b082bacc 100644 --- a/docs/index.html +++ b/docs/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

See your apps' network activity.
brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniversalGPL-3.0No telemetry

+

v0.15.6macOS 15+UniversalGPL-3.0No telemetry

@@ -594,7 +594,7 @@

Know what leaves your Mac.

diff --git a/docs/it/about/index.html b/docs/it/about/index.html index fc17bb70..f09ce987 100644 --- a/docs/it/about/index.html +++ b/docs/it/about/index.html @@ -152,7 +152,7 @@

Ringraziamenti

diff --git a/docs/it/docs/index.html b/docs/it/docs/index.html index 08d8ef64..63987cef 100644 --- a/docs/it/docs/index.html +++ b/docs/it/docs/index.html @@ -76,7 +76,7 @@

Documentazione

Usare Flowlight

-

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.15.5, macOS 15 o successivo.

+

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.15.6, macOS 15 o successivo.

diff --git a/docs/it/index.html b/docs/it/index.html index dce4c12c..1244dc9b 100644 --- a/docs/it/index.html +++ b/docs/it/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Vedi la rete delle tue app.
Ca Metti una stella su GitHub

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniversaleGPL-3.0Nessuna telemetria

+

v0.15.6macOS 15+UniversaleGPL-3.0Nessuna telemetria

@@ -572,7 +572,7 @@

Sappi che cosa esce dal tuo Mac.

diff --git a/docs/it/privacy/index.html b/docs/it/privacy/index.html index 40eb2eac..973bcda6 100644 --- a/docs/it/privacy/index.html +++ b/docs/it/privacy/index.html @@ -189,7 +189,7 @@

Contatti

diff --git a/docs/it/threat-model/index.html b/docs/it/threat-model/index.html index f0e1d09d..b6f54d6d 100644 --- a/docs/it/threat-model/index.html +++ b/docs/it/threat-model/index.html @@ -223,7 +223,7 @@

Segnalare una vulnerabilità

diff --git a/docs/ja/about/index.html b/docs/ja/about/index.html index 2cbe255d..cf08426a 100644 --- a/docs/ja/about/index.html +++ b/docs/ja/about/index.html @@ -153,7 +153,7 @@

謝辞

diff --git a/docs/ja/docs/index.html b/docs/ja/docs/index.html index febcec14..c9a1acdc 100644 --- a/docs/ja/docs/index.html +++ b/docs/ja/docs/index.html @@ -76,7 +76,7 @@

ドキュメント

Flowlight の使い方

-

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.15.5、macOS 15 以降。

+

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.15.6、macOS 15 以降。

diff --git a/docs/ja/index.html b/docs/ja/index.html index 2f5958a7..1fbfea78 100644 --- a/docs/ja/index.html +++ b/docs/ja/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

アプリの通信が見える。
brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+ユニバーサルGPL-3.0テレメトリなし

+

v0.15.6macOS 15+ユニバーサルGPL-3.0テレメトリなし

@@ -571,7 +571,7 @@

Mac から何が出ていくのかを知る。

diff --git a/docs/ja/privacy/index.html b/docs/ja/privacy/index.html index aee69594..156fa76e 100644 --- a/docs/ja/privacy/index.html +++ b/docs/ja/privacy/index.html @@ -187,7 +187,7 @@

連絡先

diff --git a/docs/ja/threat-model/index.html b/docs/ja/threat-model/index.html index 9d34d735..b54d85b7 100644 --- a/docs/ja/threat-model/index.html +++ b/docs/ja/threat-model/index.html @@ -222,7 +222,7 @@

脆弱性を報告する

diff --git a/docs/ko/about/index.html b/docs/ko/about/index.html index a47efaec..09319d4c 100644 --- a/docs/ko/about/index.html +++ b/docs/ko/about/index.html @@ -153,7 +153,7 @@

감사

diff --git a/docs/ko/docs/index.html b/docs/ko/docs/index.html index 9dbfce0e..8b625c8a 100644 --- a/docs/ko/docs/index.html +++ b/docs/ko/docs/index.html @@ -76,7 +76,7 @@

문서

Flowlight 사용하기

-

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.15.5, macOS 15 이상.

+

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.15.6, macOS 15 이상.

diff --git a/docs/ko/index.html b/docs/ko/index.html index b812881a..6b4e4c04 100644 --- a/docs/ko/index.html +++ b/docs/ko/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

앱이 무엇을 하는지 봅니다.

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+유니버설GPL-3.0텔레메트리 없음

+

v0.15.6macOS 15+유니버설GPL-3.0텔레메트리 없음

@@ -572,7 +572,7 @@

내 Mac에서 무엇이 나가는지 아세요.

diff --git a/docs/ko/privacy/index.html b/docs/ko/privacy/index.html index 35c2df0b..73085658 100644 --- a/docs/ko/privacy/index.html +++ b/docs/ko/privacy/index.html @@ -190,7 +190,7 @@

문의

diff --git a/docs/ko/threat-model/index.html b/docs/ko/threat-model/index.html index 4203bc4f..3a39a54a 100644 --- a/docs/ko/threat-model/index.html +++ b/docs/ko/threat-model/index.html @@ -221,7 +221,7 @@

취약점 신고하기

diff --git a/docs/llms-full.txt b/docs/llms-full.txt index d5947d3a..ca3d0e0d 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -62,7 +62,7 @@ Documentation Using Flowlight - Everything from the first launch to tuning the agent rules. Flowlight 0.15.5, macOS 15 or later. + Everything from the first launch to tuning the agent rules. Flowlight 0.15.6, macOS 15 or later. On this page @@ -894,7 +894,7 @@ Understand your AI agents. brew install --cask xinbetween/tap/flowlightCopy - v0.15.5macOS 15+UniversalGPL-3.0No telemetry + v0.15.6macOS 15+UniversalGPL-3.0No telemetry connectionslive @@ -1629,8 +1629,21 @@ Releases Downloads, checksums and full notes for each version are on GitHub Releases. + 0.15.6 +October 23, 2026Latest + + Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs. + + Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and fails CI if shared project files are + stale while continuing to ignore user-specific and Xcode-managed state. + + Preserve both distribution channels. The committed project builds the sandboxed App Store content-filter + extension and the Developer ID system extension as separate product graphs, with Store packaging checks unchanged. + 0.15.5 -October 22, 2026Latest +October 22, 2026 Keep changed packs visible until fresh consent. A catalog update that disables an active pack now raises a persistent app-wide notice and Rules badge. Changed and removed packs stay off and visible until acknowledged or freshly diff --git a/docs/llms.txt b/docs/llms.txt index f10ea704..dddd8170 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -1,6 +1,6 @@ # Flowlight -> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.15.5. +> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.15.6. - [Download Flowlight.dmg](https://github.com/xinbetween/flowlight/releases/latest/download/Flowlight.dmg) - [Source code](https://github.com/xinbetween/flowlight) diff --git a/docs/plugins/index.html b/docs/plugins/index.html index 313ec311..902083f4 100644 --- a/docs/plugins/index.html +++ b/docs/plugins/index.html @@ -211,7 +211,7 @@

Review checklist

diff --git a/docs/privacy/index.html b/docs/privacy/index.html index 347192ac..d840f74a 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -196,7 +196,7 @@

Contact

diff --git a/docs/pt-PT/about/index.html b/docs/pt-PT/about/index.html index e2883ebc..fde3bba2 100644 --- a/docs/pt-PT/about/index.html +++ b/docs/pt-PT/about/index.html @@ -152,7 +152,7 @@

Agradecimentos

diff --git a/docs/pt-PT/docs/index.html b/docs/pt-PT/docs/index.html index f905f670..043511d3 100644 --- a/docs/pt-PT/docs/index.html +++ b/docs/pt-PT/docs/index.html @@ -76,7 +76,7 @@

Documentação

Usar o Flowlight

-

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.15.5, macOS 15 ou posterior.

+

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.15.6, macOS 15 ou posterior.

diff --git a/docs/pt-PT/index.html b/docs/pt-PT/index.html index fe88b78e..8f782bf5 100644 --- a/docs/pt-PT/index.html +++ b/docs/pt-PT/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Veja a atividade de rede das suas apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+UniversalGPL-3.0Sem telemetria

+

v0.15.6macOS 15+UniversalGPL-3.0Sem telemetria

@@ -572,7 +572,7 @@

Saiba o que sai do seu Mac.

diff --git a/docs/pt-PT/privacy/index.html b/docs/pt-PT/privacy/index.html index f963a4a4..d8ab03c3 100644 --- a/docs/pt-PT/privacy/index.html +++ b/docs/pt-PT/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/pt-PT/threat-model/index.html b/docs/pt-PT/threat-model/index.html index 10619b71..6af27c83 100644 --- a/docs/pt-PT/threat-model/index.html +++ b/docs/pt-PT/threat-model/index.html @@ -222,7 +222,7 @@

Comunicar uma vulnerabilidade

diff --git a/docs/releases/index.html b/docs/releases/index.html index 2af01e65..9732c2a0 100644 --- a/docs/releases/index.html +++ b/docs/releases/index.html @@ -28,7 +28,7 @@ - + @@ -61,7 +61,20 @@

What's new

-

0.15.5

Latest
+

0.15.6

Latest
+
    +
  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs.
  • +
  • Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and fails CI if shared project files are + stale while continuing to ignore user-specific and Xcode-managed state.
  • +
  • Preserve both distribution channels. The committed project builds the sandboxed App Store content-filter + extension and the Developer ID system extension as separate product graphs, with Store packaging checks unchanged.
  • +
+
+ +
+

0.15.5

  • Keep changed packs visible until fresh consent. A catalog update that disables an active pack now raises a persistent app-wide notice and Rules badge. Changed and removed packs stay off and visible until acknowledged or freshly @@ -1310,7 +1323,7 @@

    What's new

diff --git a/docs/sitemap.xml b/docs/sitemap.xml index bfe3b975..9f8edb91 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -5,7 +5,7 @@ https://flowlight.xinbetween.com/2026-10-20 https://flowlight.xinbetween.com/plugins/2026-10-13 https://flowlight.xinbetween.com/privacy/2026-10-20 - https://flowlight.xinbetween.com/releases/2026-10-22 + https://flowlight.xinbetween.com/releases/2026-10-23 https://flowlight.xinbetween.com/threat-model/2026-10-22 https://flowlight.xinbetween.com/de/about/2026-09-26 https://flowlight.xinbetween.com/de/docs/2026-10-22 diff --git a/docs/threat-model/index.html b/docs/threat-model/index.html index 7a3fa269..bd4ed3e9 100644 --- a/docs/threat-model/index.html +++ b/docs/threat-model/index.html @@ -231,7 +231,7 @@

Reporting a vulnerability

diff --git a/docs/zh-Hans/about/index.html b/docs/zh-Hans/about/index.html index 59f54b1b..2e798345 100644 --- a/docs/zh-Hans/about/index.html +++ b/docs/zh-Hans/about/index.html @@ -152,7 +152,7 @@

致谢

diff --git a/docs/zh-Hans/docs/index.html b/docs/zh-Hans/docs/index.html index 6060f6c1..05394e46 100644 --- a/docs/zh-Hans/docs/index.html +++ b/docs/zh-Hans/docs/index.html @@ -76,7 +76,7 @@

文档

使用 Flowlight

-

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.15.5,macOS 15 或更高版本。

+

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.15.6,macOS 15 或更高版本。

diff --git a/docs/zh-Hans/index.html b/docs/zh-Hans/index.html index 70c226b0..61c17681 100644 --- a/docs/zh-Hans/index.html +++ b/docs/zh-Hans/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

看清应用的网络活动。

brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+通用架构GPL-3.0无遥测

+

v0.15.6macOS 15+通用架构GPL-3.0无遥测

@@ -569,7 +569,7 @@

知道什么离开了你的 Mac。

diff --git a/docs/zh-Hans/privacy/index.html b/docs/zh-Hans/privacy/index.html index ebacd1af..be20231b 100644 --- a/docs/zh-Hans/privacy/index.html +++ b/docs/zh-Hans/privacy/index.html @@ -187,7 +187,7 @@

联系方式

diff --git a/docs/zh-Hans/threat-model/index.html b/docs/zh-Hans/threat-model/index.html index 1fe3dd17..3a633480 100644 --- a/docs/zh-Hans/threat-model/index.html +++ b/docs/zh-Hans/threat-model/index.html @@ -210,7 +210,7 @@

报告漏洞

diff --git a/docs/zh-Hant/about/index.html b/docs/zh-Hant/about/index.html index b320e7a1..a4c57a6b 100644 --- a/docs/zh-Hant/about/index.html +++ b/docs/zh-Hant/about/index.html @@ -152,7 +152,7 @@

致謝

diff --git a/docs/zh-Hant/docs/index.html b/docs/zh-Hant/docs/index.html index 164dbca9..7f4b6afa 100644 --- a/docs/zh-Hant/docs/index.html +++ b/docs/zh-Hant/docs/index.html @@ -76,7 +76,7 @@

說明文件

使用 Flowlight

-

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.15.5,macOS 15 或以上版本。

+

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.15.6,macOS 15 或以上版本。

diff --git a/docs/zh-Hant/index.html b/docs/zh-Hant/index.html index fab1ff4e..40a6a045 100644 --- a/docs/zh-Hant/index.html +++ b/docs/zh-Hant/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

看見每個 App 的網路活動。
brew install --cask xinbetween/tap/flowlight

-

v0.15.5macOS 15+通用架構GPL-3.0無遙測

+

v0.15.6macOS 15+通用架構GPL-3.0無遙測

@@ -570,7 +570,7 @@

知道有什麼離開了你的 Mac。

diff --git a/docs/zh-Hant/privacy/index.html b/docs/zh-Hant/privacy/index.html index c3eb5a1b..2a2b0e98 100644 --- a/docs/zh-Hant/privacy/index.html +++ b/docs/zh-Hant/privacy/index.html @@ -187,7 +187,7 @@

聯絡

diff --git a/docs/zh-Hant/threat-model/index.html b/docs/zh-Hant/threat-model/index.html index cd46992f..3b2485b7 100644 --- a/docs/zh-Hant/threat-model/index.html +++ b/docs/zh-Hant/threat-model/index.html @@ -211,7 +211,7 @@

回報漏洞

diff --git a/project.yml b/project.yml index f963b789..75a99ded 100644 --- a/project.yml +++ b/project.yml @@ -15,8 +15,8 @@ settings: DEVELOPMENT_TEAM: "" CODE_SIGN_STYLE: Automatic ENABLE_HARDENED_RUNTIME: YES - MARKETING_VERSION: "0.15.5" - CURRENT_PROJECT_VERSION: "52" + MARKETING_VERSION: "0.15.7" + CURRENT_PROJECT_VERSION: "54" configs: AppStore: DEVELOPMENT_TEAM: 38RJUJHKZS diff --git a/scripts/check_xcode_project.sh b/scripts/check_xcode_project.sh new file mode 100755 index 00000000..7bc4d726 --- /dev/null +++ b/scripts/check_xcode_project.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# Regenerates the committed XcodeGen project in isolation and fails if its shared files drift. +set -euo pipefail +cd "$(dirname "$0")/.." + +command -v xcodegen >/dev/null || { + echo "xcodegen is required (brew install xcodegen)." >&2 + exit 1 +} + +mode=${1:-check} +if [[ "$mode" != check && "$mode" != --write ]]; then + echo "usage: scripts/check_xcode_project.sh [--write]" >&2 + exit 2 +fi + +temporary=$(mktemp -d "${TMPDIR:-/tmp}/flowlight-xcode-project.XXXXXX") +trap 'rm -rf "$temporary"' EXIT + +# Copy tracked and nonignored untracked files, including working-tree edits, without build output or Xcode state. +while IFS= read -r -d '' file; do + case "$file" in + Flowlight.xcodeproj/*) continue ;; + esac + [[ -e "$file" || -L "$file" ]] || continue + mkdir -p "$temporary/$(dirname "$file")" + cp -P "$file" "$temporary/$file" +done < <(git ls-files --cached --others --exclude-standard -z) + +( + cd "$temporary" + xcodegen generate >/dev/null + python3 -I scripts/normalize_xcode_project.py +) + +shared=( + "project.pbxproj" + "project.xcworkspace/contents.xcworkspacedata" + "xcshareddata/xcschemes/Flowlight.xcscheme" + "xcshareddata/xcschemes/Flowlight App Store.xcscheme" +) + +if [[ "$mode" == --write ]]; then + for file in "${shared[@]}"; do + mkdir -p "Flowlight.xcodeproj/$(dirname "$file")" + cp "$temporary/Flowlight.xcodeproj/$file" "Flowlight.xcodeproj/$file" + done + echo "Regenerated the committed Xcode project from project.yml." + exit 0 +fi + +changed=0 +for file in "${shared[@]}"; do + expected="$temporary/Flowlight.xcodeproj/$file" + committed="Flowlight.xcodeproj/$file" + if [[ ! -f "$committed" ]] || ! cmp -s "$expected" "$committed"; then + echo "--- $committed" + echo "+++ generated from project.yml" + diff -u "$committed" "$expected" || true + changed=1 + fi +done + +if [[ "$changed" -ne 0 ]]; then + echo "Flowlight.xcodeproj is out of date — run scripts/check_xcode_project.sh --write and commit the shared files." >&2 + exit 1 +fi + +echo "Committed Xcode project matches project.yml." diff --git a/scripts/normalize_xcode_project.py b/scripts/normalize_xcode_project.py new file mode 100755 index 00000000..6b3dc359 --- /dev/null +++ b/scripts/normalize_xcode_project.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +"""Canonicalize XcodeGen's equivalent duplicate copy-phase ordering.""" + +from pathlib import Path +import re +import sys + +PROJECT = Path(__file__).resolve().parents[1] / "Flowlight.xcodeproj/project.pbxproj" +PHASE = re.compile( + r"(?P
\t\t(?P[A-F0-9]{24}) /\* Embed Dependencies \*/ = \{\n)" + r"(?P\t\t\tisa = PBXCopyFilesBuildPhase;\n.*?" + r'\t\t\tname = "Embed Dependencies";\n' + r"\t\t\trunOnlyForDeploymentPostprocessing = 0;\n)" + r"(?P
\t\t\};)", + re.DOTALL, +) + + +def main() -> int: + source = PROJECT.read_text() + matches = list(PHASE.finditer(source)) + if len(matches) != 2: + print( + f"expected exactly two Embed Dependencies phases, found {len(matches)}", + file=sys.stderr, + ) + return 1 + + bodies = [match.group("body") for match in matches] + destinations = [] + for body in bodies: + found = re.search(r"^\t\t\tdstPath = (.*);$", body, re.MULTILINE) + if found is None: + print("an Embed Dependencies phase has no destination", file=sys.stderr) + return 1 + destinations.append(found.group(1)) + + expected = {"../Library/Helpers", "../Library/SystemExtensions"} + if set(destinations) != expected: + print( + f"unexpected Embed Dependencies destinations: {sorted(destinations)}", + file=sys.stderr, + ) + return 1 + + ordered_bodies = sorted(bodies, key=lambda body: re.search( + r"^\t\t\tdstPath = (.*);$", body, re.MULTILINE + ).group(1)) + pieces = [] + cursor = 0 + for match, body in zip(matches, ordered_bodies): + pieces.append(source[cursor:match.start()]) + pieces.append(match.group("header") + body + match.group("footer")) + cursor = match.end() + pieces.append(source[cursor:]) + PROJECT.write_text("".join(pieces)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/site/pages/releases.html b/site/pages/releases.html index bf096b32..06e99728 100644 --- a/site/pages/releases.html +++ b/site/pages/releases.html @@ -13,7 +13,20 @@

What's new

-

0.15.5

Latest
+

0.15.6

Latest
+
    +
  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs.
  • +
  • Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and fails CI if shared project files are + stale while continuing to ignore user-specific and Xcode-managed state.
  • +
  • Preserve both distribution channels. The committed project builds the sandboxed App Store content-filter + extension and the Developer ID system extension as separate product graphs, with Store packaging checks unchanged.
  • +
+
+ +
+

0.15.5

  • Keep changed packs visible until fresh consent. A catalog update that disables an active pack now raises a persistent app-wide notice and Rules badge. Changed and removed packs stay off and visible until acknowledged or freshly From 61486f42c7071d59fd8770c3af3ac62f75d514a2 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Fri, 23 Oct 2026 20:23:37 -0700 Subject: [PATCH 2/9] Guard Xcode project phase normalization Co-Authored-By: Claude Code --- scripts/normalize_xcode_project.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/normalize_xcode_project.py b/scripts/normalize_xcode_project.py index 6b3dc359..8ed1ba02 100755 --- a/scripts/normalize_xcode_project.py +++ b/scripts/normalize_xcode_project.py @@ -43,6 +43,20 @@ def main() -> int: ) return 1 + phase_ids = [match.group("id") for match in matches] + direct_target = re.search( + r"/\* Flowlight \*/ = \{\n\t\t\tisa = PBXNativeTarget;.*?" + r"\t\t\tbuildPhases = \(\n(?P.*?)\t\t\t\);", + source, + re.DOTALL, + ) + if direct_target is None or any( + f"{phase_id} /* Embed Dependencies */" not in direct_target.group("phases") + for phase_id in phase_ids + ): + print("both Embed Dependencies phases must belong to the Flowlight target", file=sys.stderr) + return 1 + ordered_bodies = sorted(bodies, key=lambda body: re.search( r"^\t\t\tdstPath = (.*);$", body, re.MULTILINE ).group(1)) From 4e1833709ec3f0ade58a7543781f2681138d38a8 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Fri, 23 Oct 2026 20:35:05 -0700 Subject: [PATCH 3/9] Harden Xcode project drift checks Validate generated shared project files against both the working tree and the exact Git index, discover all shared schemes, and preserve unusual Git paths during isolated regeneration. Co-Authored-By: Claude Code --- scripts/check_xcode_project.sh | 110 ++++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 29 deletions(-) diff --git a/scripts/check_xcode_project.sh b/scripts/check_xcode_project.sh index 7bc4d726..a990e8a5 100755 --- a/scripts/check_xcode_project.sh +++ b/scripts/check_xcode_project.sh @@ -16,54 +16,106 @@ fi temporary=$(mktemp -d "${TMPDIR:-/tmp}/flowlight-xcode-project.XXXXXX") trap 'rm -rf "$temporary"' EXIT +working_source="$temporary/working-source" +index_source="$temporary/index-source" +index_committed="$temporary/index-committed" +mkdir -p -- "$working_source" "$index_source" "$index_committed" -# Copy tracked and nonignored untracked files, including working-tree edits, without build output or Xcode state. +copy_parent() { + local root=$1 file=$2 parent + if [[ "$file" == */* ]]; then parent=${file%/*}; else parent=.; fi + mkdir -p -- "$root/$parent" +} + +# Reproduce the working tree, including nonignored untracked files, without build output or Xcode state. while IFS= read -r -d '' file; do case "$file" in Flowlight.xcodeproj/*) continue ;; esac [[ -e "$file" || -L "$file" ]] || continue - mkdir -p "$temporary/$(dirname "$file")" - cp -P "$file" "$temporary/$file" + copy_parent "$working_source" "$file" + cp -P -- "./$file" "$working_source/$file" done < <(git ls-files --cached --others --exclude-standard -z) -( - cd "$temporary" - xcodegen generate >/dev/null - python3 -I scripts/normalize_xcode_project.py -) +# Reproduce the exact staged tree separately. Preserve its project for comparison, then regenerate from its spec. +git checkout-index --all --prefix="$index_source/" +if [[ -d "$index_source/Flowlight.xcodeproj" ]]; then + cp -R "$index_source/Flowlight.xcodeproj/." "$index_committed/" + rm -rf "$index_source/Flowlight.xcodeproj" +fi + +for root in "$working_source" "$index_source"; do + ( + cd "$root" + xcodegen generate >/dev/null + python3 -I scripts/normalize_xcode_project.py + ) +done -shared=( - "project.pbxproj" - "project.xcworkspace/contents.xcworkspacedata" - "xcshareddata/xcschemes/Flowlight.xcscheme" - "xcshareddata/xcschemes/Flowlight App Store.xcscheme" -) +copy_shared() { + local source=$1 destination=$2 file relative parent + mkdir -p -- "$destination" + for file in \ + "$source/project.pbxproj" \ + "$source/project.xcworkspace/contents.xcworkspacedata"; do + [[ -f "$file" ]] || continue + relative=${file#"$source/"} + copy_parent "$destination" "$relative" + cp -- "$file" "$destination/$relative" + done + if [[ -d "$source/xcshareddata/xcschemes" ]]; then + while IFS= read -r -d '' file; do + relative=${file#"$source/"} + copy_parent "$destination" "$relative" + cp -- "$file" "$destination/$relative" + done < <(find "$source/xcshareddata/xcschemes" -type f -name '*.xcscheme' -print0) + fi +} + +working_expected="$temporary/working-expected" +working_committed="$temporary/working-committed" +index_expected="$temporary/index-expected" +copy_shared "$working_source/Flowlight.xcodeproj" "$working_expected" +copy_shared Flowlight.xcodeproj "$working_committed" +copy_shared "$index_source/Flowlight.xcodeproj" "$index_expected" if [[ "$mode" == --write ]]; then - for file in "${shared[@]}"; do - mkdir -p "Flowlight.xcodeproj/$(dirname "$file")" - cp "$temporary/Flowlight.xcodeproj/$file" "Flowlight.xcodeproj/$file" + for file in project.pbxproj project.xcworkspace/contents.xcworkspacedata; do + copy_parent Flowlight.xcodeproj "$file" + cp -- "$working_expected/$file" "Flowlight.xcodeproj/$file" done + + mkdir -p -- Flowlight.xcodeproj/xcshareddata/xcschemes + while IFS= read -r -d '' file; do + relative=${file#"Flowlight.xcodeproj/"} + [[ -f "$working_expected/$relative" ]] || rm -f -- "$file" + done < <(find Flowlight.xcodeproj/xcshareddata/xcschemes -type f -name '*.xcscheme' -print0) + while IFS= read -r -d '' file; do + relative=${file#"$working_expected/"} + copy_parent Flowlight.xcodeproj "$relative" + cp -- "$file" "Flowlight.xcodeproj/$relative" + done < <(find "$working_expected/xcshareddata/xcschemes" -type f -name '*.xcscheme' -print0) + echo "Regenerated the committed Xcode project from project.yml." + echo "Stage project.yml and Flowlight.xcodeproj, then run this check again." exit 0 fi changed=0 -for file in "${shared[@]}"; do - expected="$temporary/Flowlight.xcodeproj/$file" - committed="Flowlight.xcodeproj/$file" - if [[ ! -f "$committed" ]] || ! cmp -s "$expected" "$committed"; then - echo "--- $committed" - echo "+++ generated from project.yml" - diff -u "$committed" "$expected" || true - changed=1 - fi -done +if ! diff -qr "$working_committed" "$working_expected" >/dev/null; then + echo "Working-tree Flowlight.xcodeproj differs from working-tree project.yml:" + diff -ru "$working_committed" "$working_expected" || true + changed=1 +fi +if ! diff -qr "$index_committed" "$index_expected" >/dev/null; then + echo "Staged Flowlight.xcodeproj differs from staged project.yml:" + diff -ru "$index_committed" "$index_expected" || true + changed=1 +fi if [[ "$changed" -ne 0 ]]; then - echo "Flowlight.xcodeproj is out of date — run scripts/check_xcode_project.sh --write and commit the shared files." >&2 + echo "Flowlight.xcodeproj is out of date — run scripts/check_xcode_project.sh --write, stage the shared files, and check again." >&2 exit 1 fi -echo "Committed Xcode project matches project.yml." +echo "Committed Xcode project matches project.yml in both the working tree and Git index." From 84407f0dbc7580009cf311fb98f16bf3ccf5bec9 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 20:27:40 -0700 Subject: [PATCH 4/9] Prepare Flowlight 0.15.7 Advance the corrected Xcode Cloud project to build 54 and publish release notes for the Store entitlement repair. Co-Authored-By: Claude Code --- Flowlight.xcodeproj/project.pbxproj | 12 ++++++------ docs/404.html | 2 +- docs/about/index.html | 2 +- docs/de/about/index.html | 2 +- docs/de/docs/index.html | 4 ++-- docs/de/index.html | 6 +++--- docs/de/privacy/index.html | 2 +- docs/de/threat-model/index.html | 2 +- docs/docs/index.html | 4 ++-- docs/es/about/index.html | 2 +- docs/es/docs/index.html | 4 ++-- docs/es/index.html | 6 +++--- docs/es/privacy/index.html | 2 +- docs/es/threat-model/index.html | 2 +- docs/fr/about/index.html | 2 +- docs/fr/docs/index.html | 4 ++-- docs/fr/index.html | 6 +++--- docs/fr/privacy/index.html | 2 +- docs/fr/threat-model/index.html | 2 +- docs/index.html | 6 +++--- docs/it/about/index.html | 2 +- docs/it/docs/index.html | 4 ++-- docs/it/index.html | 6 +++--- docs/it/privacy/index.html | 2 +- docs/it/threat-model/index.html | 2 +- docs/ja/about/index.html | 2 +- docs/ja/docs/index.html | 4 ++-- docs/ja/index.html | 6 +++--- docs/ja/privacy/index.html | 2 +- docs/ja/threat-model/index.html | 2 +- docs/ko/about/index.html | 2 +- docs/ko/docs/index.html | 4 ++-- docs/ko/index.html | 6 +++--- docs/ko/privacy/index.html | 2 +- docs/ko/threat-model/index.html | 2 +- docs/llms-full.txt | 19 ++++++++++++++++--- docs/llms.txt | 2 +- docs/plugins/index.html | 2 +- docs/privacy/index.html | 2 +- docs/pt-PT/about/index.html | 2 +- docs/pt-PT/docs/index.html | 4 ++-- docs/pt-PT/index.html | 6 +++--- docs/pt-PT/privacy/index.html | 2 +- docs/pt-PT/threat-model/index.html | 2 +- docs/releases/index.html | 19 ++++++++++++++++--- docs/sitemap.xml | 2 +- docs/threat-model/index.html | 2 +- docs/zh-Hans/about/index.html | 2 +- docs/zh-Hans/docs/index.html | 4 ++-- docs/zh-Hans/index.html | 6 +++--- docs/zh-Hans/privacy/index.html | 2 +- docs/zh-Hans/threat-model/index.html | 2 +- docs/zh-Hant/about/index.html | 2 +- docs/zh-Hant/docs/index.html | 4 ++-- docs/zh-Hant/index.html | 6 +++--- docs/zh-Hant/privacy/index.html | 2 +- docs/zh-Hant/threat-model/index.html | 2 +- site/pages/releases.html | 15 ++++++++++++++- 58 files changed, 136 insertions(+), 97 deletions(-) diff --git a/Flowlight.xcodeproj/project.pbxproj b/Flowlight.xcodeproj/project.pbxproj index 8f5d4344..fecb5226 100644 --- a/Flowlight.xcodeproj/project.pbxproj +++ b/Flowlight.xcodeproj/project.pbxproj @@ -2183,7 +2183,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 54; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -2198,7 +2198,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.7; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2244,7 +2244,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 54; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 38RJUJHKZS; ENABLE_HARDENED_RUNTIME = YES; @@ -2259,7 +2259,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.7; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2325,7 +2325,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 51; + CURRENT_PROJECT_VERSION = 54; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -2346,7 +2346,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.15.6; + MARKETING_VERSION = 0.15.7; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; diff --git a/docs/404.html b/docs/404.html index 2c7f8501..01e59de6 100644 --- a/docs/404.html +++ b/docs/404.html @@ -86,7 +86,7 @@

    That page isn't here

    Try the home page,

diff --git a/docs/about/index.html b/docs/about/index.html index b152f6fc..88175e6c 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -153,7 +153,7 @@

Thanks

diff --git a/docs/de/about/index.html b/docs/de/about/index.html index 1581c478..51bd6e3e 100644 --- a/docs/de/about/index.html +++ b/docs/de/about/index.html @@ -152,7 +152,7 @@

Dank

diff --git a/docs/de/docs/index.html b/docs/de/docs/index.html index 2f948636..ab067a16 100644 --- a/docs/de/docs/index.html +++ b/docs/de/docs/index.html @@ -76,7 +76,7 @@

Dokumentation

Flowlight benutzen

-

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.15.6, macOS 15 oder neuer.

+

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.15.7, macOS 15 oder neuer.

diff --git a/docs/de/index.html b/docs/de/index.html index 2aba175d..f4e95f53 100644 --- a/docs/de/index.html +++ b/docs/de/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Sieh, was deine Apps im Netz tun.
brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniversalGPL-3.0Keine Telemetrie

+

v0.15.7macOS 15+UniversalGPL-3.0Keine Telemetrie

@@ -572,7 +572,7 @@

Wisse, was deinen Mac verlässt.

diff --git a/docs/de/privacy/index.html b/docs/de/privacy/index.html index d4b13278..3ed45d11 100644 --- a/docs/de/privacy/index.html +++ b/docs/de/privacy/index.html @@ -189,7 +189,7 @@

Kontakt

diff --git a/docs/de/threat-model/index.html b/docs/de/threat-model/index.html index 4a4bf1ed..6cba0eb5 100644 --- a/docs/de/threat-model/index.html +++ b/docs/de/threat-model/index.html @@ -225,7 +225,7 @@

Eine Schwachstelle melden

diff --git a/docs/docs/index.html b/docs/docs/index.html index 1c2691a7..b80a3768 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -76,7 +76,7 @@

Documentation

Using Flowlight

-

Everything from the first launch to tuning the agent rules. Flowlight 0.15.6, macOS 15 or later.

+

Everything from the first launch to tuning the agent rules. Flowlight 0.15.7, macOS 15 or later.

diff --git a/docs/es/about/index.html b/docs/es/about/index.html index f42bf604..ef6bfa4a 100644 --- a/docs/es/about/index.html +++ b/docs/es/about/index.html @@ -152,7 +152,7 @@

Agradecimientos

diff --git a/docs/es/docs/index.html b/docs/es/docs/index.html index 2dee3612..5e55f057 100644 --- a/docs/es/docs/index.html +++ b/docs/es/docs/index.html @@ -76,7 +76,7 @@

Documentación

Usar Flowlight

-

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.15.6, macOS 15 o posterior.

+

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.15.7, macOS 15 o posterior.

diff --git a/docs/es/index.html b/docs/es/index.html index 73330a5a..08aa1045 100644 --- a/docs/es/index.html +++ b/docs/es/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Observa la actividad de red de tus apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniversalGPL-3.0Sin telemetría

+

v0.15.7macOS 15+UniversalGPL-3.0Sin telemetría

@@ -572,7 +572,7 @@

Ten claro qué sale de tu Mac.

diff --git a/docs/es/privacy/index.html b/docs/es/privacy/index.html index 8f3b9a53..bac4b01a 100644 --- a/docs/es/privacy/index.html +++ b/docs/es/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/es/threat-model/index.html b/docs/es/threat-model/index.html index ae84a020..caf842b0 100644 --- a/docs/es/threat-model/index.html +++ b/docs/es/threat-model/index.html @@ -221,7 +221,7 @@

Informar de una vulnerabilidad

diff --git a/docs/fr/about/index.html b/docs/fr/about/index.html index 5f82f33f..ab4a5916 100644 --- a/docs/fr/about/index.html +++ b/docs/fr/about/index.html @@ -152,7 +152,7 @@

Remerciements

diff --git a/docs/fr/docs/index.html b/docs/fr/docs/index.html index 0e1d2c57..871c8708 100644 --- a/docs/fr/docs/index.html +++ b/docs/fr/docs/index.html @@ -76,7 +76,7 @@

Documentation

Utiliser Flowlight

-

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.15.6, macOS 15 ou version ultérieure.

+

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.15.7, macOS 15 ou version ultérieure.

diff --git a/docs/fr/index.html b/docs/fr/index.html index 72cc83be..4986158a 100644 --- a/docs/fr/index.html +++ b/docs/fr/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Voyez l’activité réseau de vos apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniverselGPL-3.0Sans télémétrie

+

v0.15.7macOS 15+UniverselGPL-3.0Sans télémétrie

@@ -572,7 +572,7 @@

Sachez ce qui quitte votre Mac.

diff --git a/docs/fr/privacy/index.html b/docs/fr/privacy/index.html index a2afc061..88c4749b 100644 --- a/docs/fr/privacy/index.html +++ b/docs/fr/privacy/index.html @@ -189,7 +189,7 @@

Contact

diff --git a/docs/fr/threat-model/index.html b/docs/fr/threat-model/index.html index 9d2a6c7e..4c490932 100644 --- a/docs/fr/threat-model/index.html +++ b/docs/fr/threat-model/index.html @@ -224,7 +224,7 @@

Signaler une vulnérabilité

diff --git a/docs/index.html b/docs/index.html index b082bacc..6e39170f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

See your apps' network activity.
brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniversalGPL-3.0No telemetry

+

v0.15.7macOS 15+UniversalGPL-3.0No telemetry

@@ -594,7 +594,7 @@

Know what leaves your Mac.

diff --git a/docs/it/about/index.html b/docs/it/about/index.html index f09ce987..dfdea8dd 100644 --- a/docs/it/about/index.html +++ b/docs/it/about/index.html @@ -152,7 +152,7 @@

Ringraziamenti

diff --git a/docs/it/docs/index.html b/docs/it/docs/index.html index 63987cef..675f40cc 100644 --- a/docs/it/docs/index.html +++ b/docs/it/docs/index.html @@ -76,7 +76,7 @@

Documentazione

Usare Flowlight

-

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.15.6, macOS 15 o successivo.

+

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.15.7, macOS 15 o successivo.

diff --git a/docs/it/index.html b/docs/it/index.html index 1244dc9b..4e7f1f58 100644 --- a/docs/it/index.html +++ b/docs/it/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Vedi la rete delle tue app.
Ca Metti una stella su GitHub

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniversaleGPL-3.0Nessuna telemetria

+

v0.15.7macOS 15+UniversaleGPL-3.0Nessuna telemetria

@@ -572,7 +572,7 @@

Sappi che cosa esce dal tuo Mac.

diff --git a/docs/it/privacy/index.html b/docs/it/privacy/index.html index 973bcda6..d4bc6a37 100644 --- a/docs/it/privacy/index.html +++ b/docs/it/privacy/index.html @@ -189,7 +189,7 @@

Contatti

diff --git a/docs/it/threat-model/index.html b/docs/it/threat-model/index.html index b6f54d6d..8470326e 100644 --- a/docs/it/threat-model/index.html +++ b/docs/it/threat-model/index.html @@ -223,7 +223,7 @@

Segnalare una vulnerabilità

diff --git a/docs/ja/about/index.html b/docs/ja/about/index.html index cf08426a..3f3bad4f 100644 --- a/docs/ja/about/index.html +++ b/docs/ja/about/index.html @@ -153,7 +153,7 @@

謝辞

diff --git a/docs/ja/docs/index.html b/docs/ja/docs/index.html index c9a1acdc..2ab5e0a7 100644 --- a/docs/ja/docs/index.html +++ b/docs/ja/docs/index.html @@ -76,7 +76,7 @@

ドキュメント

Flowlight の使い方

-

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.15.6、macOS 15 以降。

+

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.15.7、macOS 15 以降。

diff --git a/docs/ja/index.html b/docs/ja/index.html index 1fbfea78..14ee13f2 100644 --- a/docs/ja/index.html +++ b/docs/ja/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

アプリの通信が見える。
brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+ユニバーサルGPL-3.0テレメトリなし

+

v0.15.7macOS 15+ユニバーサルGPL-3.0テレメトリなし

@@ -571,7 +571,7 @@

Mac から何が出ていくのかを知る。

diff --git a/docs/ja/privacy/index.html b/docs/ja/privacy/index.html index 156fa76e..eeb791ae 100644 --- a/docs/ja/privacy/index.html +++ b/docs/ja/privacy/index.html @@ -187,7 +187,7 @@

連絡先

diff --git a/docs/ja/threat-model/index.html b/docs/ja/threat-model/index.html index b54d85b7..3ee8ed8f 100644 --- a/docs/ja/threat-model/index.html +++ b/docs/ja/threat-model/index.html @@ -222,7 +222,7 @@

脆弱性を報告する

diff --git a/docs/ko/about/index.html b/docs/ko/about/index.html index 09319d4c..6fc16c73 100644 --- a/docs/ko/about/index.html +++ b/docs/ko/about/index.html @@ -153,7 +153,7 @@

감사

diff --git a/docs/ko/docs/index.html b/docs/ko/docs/index.html index 8b625c8a..9cf23a90 100644 --- a/docs/ko/docs/index.html +++ b/docs/ko/docs/index.html @@ -76,7 +76,7 @@

문서

Flowlight 사용하기

-

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.15.6, macOS 15 이상.

+

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.15.7, macOS 15 이상.

diff --git a/docs/ko/index.html b/docs/ko/index.html index 6b4e4c04..a889040e 100644 --- a/docs/ko/index.html +++ b/docs/ko/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

앱이 무엇을 하는지 봅니다.

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+유니버설GPL-3.0텔레메트리 없음

+

v0.15.7macOS 15+유니버설GPL-3.0텔레메트리 없음

@@ -572,7 +572,7 @@

내 Mac에서 무엇이 나가는지 아세요.

diff --git a/docs/ko/privacy/index.html b/docs/ko/privacy/index.html index 73085658..ec919845 100644 --- a/docs/ko/privacy/index.html +++ b/docs/ko/privacy/index.html @@ -190,7 +190,7 @@

문의

diff --git a/docs/ko/threat-model/index.html b/docs/ko/threat-model/index.html index 3a39a54a..8be6b1d6 100644 --- a/docs/ko/threat-model/index.html +++ b/docs/ko/threat-model/index.html @@ -221,7 +221,7 @@

취약점 신고하기

diff --git a/docs/llms-full.txt b/docs/llms-full.txt index ca3d0e0d..7fb34430 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -62,7 +62,7 @@ Documentation Using Flowlight - Everything from the first launch to tuning the agent rules. Flowlight 0.15.6, macOS 15 or later. + Everything from the first launch to tuning the agent rules. Flowlight 0.15.7, macOS 15 or later. On this page @@ -894,7 +894,7 @@ Understand your AI agents. brew install --cask xinbetween/tap/flowlightCopy - v0.15.6macOS 15+UniversalGPL-3.0No telemetry + v0.15.7macOS 15+UniversalGPL-3.0No telemetry connectionslive @@ -1629,8 +1629,21 @@ Releases Downloads, checksums and full notes for each version are on GitHub Releases. + 0.15.7 +October 25, 2026Latest + + Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs. + + Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree + and the exact Git index while continuing to ignore user-specific and Xcode-managed state. + + Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused + inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable. + 0.15.6 -October 23, 2026Latest +October 23, 2026 Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now committed so Apple can discover the selected container before any cloud build script runs. diff --git a/docs/llms.txt b/docs/llms.txt index dddd8170..74a20d62 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -1,6 +1,6 @@ # Flowlight -> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.15.6. +> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.15.7. - [Download Flowlight.dmg](https://github.com/xinbetween/flowlight/releases/latest/download/Flowlight.dmg) - [Source code](https://github.com/xinbetween/flowlight) diff --git a/docs/plugins/index.html b/docs/plugins/index.html index 902083f4..46093a8b 100644 --- a/docs/plugins/index.html +++ b/docs/plugins/index.html @@ -211,7 +211,7 @@

Review checklist

diff --git a/docs/privacy/index.html b/docs/privacy/index.html index d840f74a..fba7fc07 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -196,7 +196,7 @@

Contact

diff --git a/docs/pt-PT/about/index.html b/docs/pt-PT/about/index.html index fde3bba2..bdf3bc7c 100644 --- a/docs/pt-PT/about/index.html +++ b/docs/pt-PT/about/index.html @@ -152,7 +152,7 @@

Agradecimentos

diff --git a/docs/pt-PT/docs/index.html b/docs/pt-PT/docs/index.html index 043511d3..4a2e6ae7 100644 --- a/docs/pt-PT/docs/index.html +++ b/docs/pt-PT/docs/index.html @@ -76,7 +76,7 @@

Documentação

Usar o Flowlight

-

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.15.6, macOS 15 ou posterior.

+

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.15.7, macOS 15 ou posterior.

diff --git a/docs/pt-PT/index.html b/docs/pt-PT/index.html index 8f782bf5..4c59f778 100644 --- a/docs/pt-PT/index.html +++ b/docs/pt-PT/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

Veja a atividade de rede das suas apps.

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+UniversalGPL-3.0Sem telemetria

+

v0.15.7macOS 15+UniversalGPL-3.0Sem telemetria

@@ -572,7 +572,7 @@

Saiba o que sai do seu Mac.

diff --git a/docs/pt-PT/privacy/index.html b/docs/pt-PT/privacy/index.html index d8ab03c3..d1abd74a 100644 --- a/docs/pt-PT/privacy/index.html +++ b/docs/pt-PT/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/pt-PT/threat-model/index.html b/docs/pt-PT/threat-model/index.html index 6af27c83..62900255 100644 --- a/docs/pt-PT/threat-model/index.html +++ b/docs/pt-PT/threat-model/index.html @@ -222,7 +222,7 @@

Comunicar uma vulnerabilidade

diff --git a/docs/releases/index.html b/docs/releases/index.html index 9732c2a0..0f467a14 100644 --- a/docs/releases/index.html +++ b/docs/releases/index.html @@ -28,7 +28,7 @@ - + @@ -61,7 +61,20 @@

What's new

-

0.15.6

Latest
+

0.15.7

Latest
+
    +
  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs.
  • +
  • Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree + and the exact Git index while continuing to ignore user-specific and Xcode-managed state.
  • +
  • Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused + inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable.
  • +
+
+ +
+

0.15.6

  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now committed so Apple can discover the selected container before any cloud build script runs.
  • @@ -1323,7 +1336,7 @@

    What's new

diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 9f8edb91..7d8c20e8 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -5,7 +5,7 @@ https://flowlight.xinbetween.com/2026-10-20 https://flowlight.xinbetween.com/plugins/2026-10-13 https://flowlight.xinbetween.com/privacy/2026-10-20 - https://flowlight.xinbetween.com/releases/2026-10-23 + https://flowlight.xinbetween.com/releases/2026-10-25 https://flowlight.xinbetween.com/threat-model/2026-10-22 https://flowlight.xinbetween.com/de/about/2026-09-26 https://flowlight.xinbetween.com/de/docs/2026-10-22 diff --git a/docs/threat-model/index.html b/docs/threat-model/index.html index bd4ed3e9..3497f256 100644 --- a/docs/threat-model/index.html +++ b/docs/threat-model/index.html @@ -231,7 +231,7 @@

Reporting a vulnerability

diff --git a/docs/zh-Hans/about/index.html b/docs/zh-Hans/about/index.html index 2e798345..877b25c2 100644 --- a/docs/zh-Hans/about/index.html +++ b/docs/zh-Hans/about/index.html @@ -152,7 +152,7 @@

致谢

diff --git a/docs/zh-Hans/docs/index.html b/docs/zh-Hans/docs/index.html index 05394e46..6b67fd3d 100644 --- a/docs/zh-Hans/docs/index.html +++ b/docs/zh-Hans/docs/index.html @@ -76,7 +76,7 @@

文档

使用 Flowlight

-

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.15.6,macOS 15 或更高版本。

+

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.15.7,macOS 15 或更高版本。

diff --git a/docs/zh-Hans/index.html b/docs/zh-Hans/index.html index 61c17681..49835c5d 100644 --- a/docs/zh-Hans/index.html +++ b/docs/zh-Hans/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

看清应用的网络活动。

brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+通用架构GPL-3.0无遥测

+

v0.15.7macOS 15+通用架构GPL-3.0无遥测

@@ -569,7 +569,7 @@

知道什么离开了你的 Mac。

diff --git a/docs/zh-Hans/privacy/index.html b/docs/zh-Hans/privacy/index.html index be20231b..87060a8e 100644 --- a/docs/zh-Hans/privacy/index.html +++ b/docs/zh-Hans/privacy/index.html @@ -187,7 +187,7 @@

联系方式

diff --git a/docs/zh-Hans/threat-model/index.html b/docs/zh-Hans/threat-model/index.html index 3a633480..4226905a 100644 --- a/docs/zh-Hans/threat-model/index.html +++ b/docs/zh-Hans/threat-model/index.html @@ -210,7 +210,7 @@

报告漏洞

diff --git a/docs/zh-Hant/about/index.html b/docs/zh-Hant/about/index.html index a4c57a6b..4b0d4a99 100644 --- a/docs/zh-Hant/about/index.html +++ b/docs/zh-Hant/about/index.html @@ -152,7 +152,7 @@

致謝

diff --git a/docs/zh-Hant/docs/index.html b/docs/zh-Hant/docs/index.html index 7f4b6afa..1ab5ff28 100644 --- a/docs/zh-Hant/docs/index.html +++ b/docs/zh-Hant/docs/index.html @@ -76,7 +76,7 @@

說明文件

使用 Flowlight

-

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.15.6,macOS 15 或以上版本。

+

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.15.7,macOS 15 或以上版本。

diff --git a/docs/zh-Hant/index.html b/docs/zh-Hant/index.html index 40a6a045..cef22d39 100644 --- a/docs/zh-Hant/index.html +++ b/docs/zh-Hant/index.html @@ -48,7 +48,7 @@ - + @@ -90,7 +90,7 @@

看見每個 App 的網路活動。
brew install --cask xinbetween/tap/flowlight

-

v0.15.6macOS 15+通用架構GPL-3.0無遙測

+

v0.15.7macOS 15+通用架構GPL-3.0無遙測

@@ -570,7 +570,7 @@

知道有什麼離開了你的 Mac。

diff --git a/docs/zh-Hant/privacy/index.html b/docs/zh-Hant/privacy/index.html index 2a2b0e98..5f6e5187 100644 --- a/docs/zh-Hant/privacy/index.html +++ b/docs/zh-Hant/privacy/index.html @@ -187,7 +187,7 @@

聯絡

diff --git a/docs/zh-Hant/threat-model/index.html b/docs/zh-Hant/threat-model/index.html index 3b2485b7..fdb8caa7 100644 --- a/docs/zh-Hant/threat-model/index.html +++ b/docs/zh-Hant/threat-model/index.html @@ -211,7 +211,7 @@

回報漏洞

diff --git a/site/pages/releases.html b/site/pages/releases.html index 06e99728..674a196e 100644 --- a/site/pages/releases.html +++ b/site/pages/releases.html @@ -13,7 +13,20 @@

What's new

-

0.15.6

Latest
+

0.15.7

Latest
+
    +
  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now + committed so Apple can discover the selected container before any cloud build script runs.
  • +
  • Keep the generated project honest. A repeatable drift gate regenerates the project from + project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree + and the exact Git index while continuing to ignore user-specific and Xcode-managed state.
  • +
  • Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused + inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable.
  • +
+
+ +
+

0.15.6

  • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now committed so Apple can discover the selected container before any cloud build script runs.
  • From 804c65e3bbc2328ff69e6486dd646eac2797c08a Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 21:10:06 -0700 Subject: [PATCH 5/9] Harden the reviewed distribution graphs Scope Store compilation to Store targets, validate signed product entitlements, pin project regeneration, and make release builds consume the committed Xcode graph. Co-Authored-By: Claude Code --- .github/workflows/ci.yml | 15 ++++++++++---- .github/workflows/codeql.yml | 4 ++-- .github/workflows/release.yml | 8 ++------ CONTRIBUTING.md | 2 +- Flowlight.xcodeproj/project.pbxproj | 1 - README.md | 2 +- ci_scripts/ci_post_xcodebuild.sh | 16 +++++++++++++++ docs/DEVELOPMENT.md | 4 ++-- docs/llms-full.txt | 13 ++++++------ docs/releases/index.html | 11 +++++----- project.yml | 1 - scripts/build-local.sh | 1 - scripts/build-signed.sh | 2 -- scripts/check_app_store_product.sh | 32 ++++++++++++++++++++--------- scripts/check_xcode_project.sh | 7 ++++++- site/pages/releases.html | 11 +++++----- 16 files changed, 79 insertions(+), 51 deletions(-) create mode 100755 ci_scripts/ci_post_xcodebuild.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 52638cc3..86f5fd14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -178,16 +178,23 @@ jobs: - name: Generate the project and reject drift run: scripts/check_xcode_project.sh - # This compiles a different product graph and activation path from the Developer ID build. Ad-hoc signing - # deliberately strips protected entitlements; archive signing validates those with the distribution profiles. + # This compiles a different product graph and activation path from the Developer ID build. The build clears + # protected entitlements because CI has no Store profiles; the next step re-signs the isolated product with the + # repository plists so the product gate still inspects the actual executable entitlements it is meant to police. - name: Build the Mac App Store product run: | xcodebuild build -project Flowlight.xcodeproj -scheme "Flowlight App Store" \ -configuration AppStore -destination 'generic/platform=macOS' -derivedDataPath "$RUNNER_TEMP/store-build" \ CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual DEVELOPMENT_TEAM= CODE_SIGN_ENTITLEMENTS= - - name: Check the Mac App Store product structure - run: scripts/check_app_store_product.sh "$RUNNER_TEMP/store-build/Build/Products/AppStore/Flowlight.app" + - name: Check the Mac App Store product structure and signed entitlements + run: | + set -euo pipefail + APP="$RUNNER_TEMP/store-build/Build/Products/AppStore/Flowlight.app" + EXTENSION="$APP/Contents/PlugIns/com.flowlight.app.filter.appex" + codesign --force --sign - --entitlements FlowlightExtension/FlowlightExtension-AppStore.entitlements "$EXTENSION" + codesign --force --sign - --entitlements Flowlight/Flowlight-AppStore.entitlements "$APP" + scripts/check_app_store_product.sh "$APP" # Ad-hoc signing: the entitlements that need a Developer ID profile are only exercised by the release build. - name: Test diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e4d46f6d..a9fe9795 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -65,8 +65,8 @@ jobs: # CodeQL something to trace, and tracing it twice would double the cost for the same findings. sudo xcode-select -s "$(ls -d /Applications/Xcode*.app | sort -V | tail -1)" xcodebuild -version - brew install xcodegen - xcodegen generate + # Analyze the exact committed graph that CI reviewed and Xcode Cloud discovers. + xcodebuild -project Flowlight.xcodeproj -list >/dev/null - uses: github/codeql-action/init@7999b86c43a865dc79d8923397f35af22de63401 # v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56e9d919..b13c434a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,12 +82,8 @@ jobs: sudo xcode-select -s "$(ls -d /Applications/Xcode*.app | sort -V | tail -1)" xcodebuild -version - - name: Install XcodeGen - run: brew install xcodegen - - - name: Generate the project - run: xcodegen generate - + # The committed project is the exact graph reviewed by CI and selected by Xcode Cloud. Release builds consume + # it directly; regeneration belongs only in the explicit drift gate before the commit is tagged. - name: Test timeout-minutes: 40 run: | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c7a95552..68d00514 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ Thanks for helping make network activity on macOS understandable. ## Getting started ```sh -brew install xcodegen +brew install xcodegen # project regeneration requires exactly 2.46.0 scripts/check_xcode_project.sh --write scripts/check_xcode_project.sh scripts/build-local.sh diff --git a/Flowlight.xcodeproj/project.pbxproj b/Flowlight.xcodeproj/project.pbxproj index fecb5226..3c941176 100644 --- a/Flowlight.xcodeproj/project.pbxproj +++ b/Flowlight.xcodeproj/project.pbxproj @@ -2264,7 +2264,6 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) APP_STORE"; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; diff --git a/README.md b/README.md index 42f2f0fd..c056a627 100644 --- a/README.md +++ b/README.md @@ -350,7 +350,7 @@ same local database. ### Build from source ```sh -brew install xcodegen +brew install xcodegen # project regeneration requires exactly 2.46.0 git clone https://github.com/xinbetween/flowlight.git && cd flowlight scripts/check_xcode_project.sh --write # regenerate the committed shared Xcode project scripts/check_xcode_project.sh # verify it still matches project.yml diff --git a/ci_scripts/ci_post_xcodebuild.sh b/ci_scripts/ci_post_xcodebuild.sh new file mode 100755 index 00000000..b10ae2dd --- /dev/null +++ b/ci_scripts/ci_post_xcodebuild.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# Xcode Cloud runs this after every action. Validate the signed Store archive that will be uploaded to TestFlight. +set -euo pipefail + +if [[ "${CI_XCODEBUILD_ACTION:-}" != archive ]]; then + exit 0 +fi +: "${CI_ARCHIVE_PATH:?Xcode Cloud did not provide CI_ARCHIVE_PATH for an archive action}" + +app="$CI_ARCHIVE_PATH/Products/Applications/Flowlight.app" +if [[ ! -d "$app" ]]; then + echo "Expected Store archive product at $app" >&2 + exit 1 +fi + +"$(dirname "$0")/../scripts/check_app_store_product.sh" "$app" diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index a8e01557..5509af4d 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -67,8 +67,8 @@ Reports group any traffic still without a hostname under its network owner. ## Building ```sh -brew install xcodegen -xcodegen generate +brew install xcodegen # project regeneration requires exactly 2.46.0 +scripts/check_xcode_project.sh --write # Any Mac, no entitlements: ad-hoc signed, nettop fallback only scripts/build-local.sh diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 7fb34430..1659fb29 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -1632,15 +1632,14 @@ Releases 0.15.7 October 25, 2026Latest - Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now - committed so Apple can discover the selected container before any cloud build script runs. + Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused + inbound-listener entitlement. - Keep the generated project honest. A repeatable drift gate regenerates the project from - project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree - and the exact Git index while continuing to ignore user-specific and Xcode-managed state. + Validate what will actually ship. The Store product gate now extracts entitlements from the built app and + extension, rejecting forbidden inbound-listener access and missing outbound access on the signed executables themselves. - Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused - inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable. + Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, + CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it. 0.15.6 October 23, 2026 diff --git a/docs/releases/index.html b/docs/releases/index.html index 0f467a14..4b0df852 100644 --- a/docs/releases/index.html +++ b/docs/releases/index.html @@ -63,13 +63,12 @@

    What's new

    0.15.7

    Latest
      -
    • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now - committed so Apple can discover the selected container before any cloud build script runs.
    • -
    • Keep the generated project honest. A repeatable drift gate regenerates the project from - project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree - and the exact Git index while continuing to ignore user-specific and Xcode-managed state.
    • Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused - inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable.
    • + inbound-listener entitlement. +
    • Validate what will actually ship. The Store product gate now extracts entitlements from the built app and + extension, rejecting forbidden inbound-listener access and missing outbound access on the signed executables themselves.
    • +
    • Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, + CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it.
    diff --git a/project.yml b/project.yml index 75a99ded..2bc0b9f7 100644 --- a/project.yml +++ b/project.yml @@ -20,7 +20,6 @@ settings: configs: AppStore: DEVELOPMENT_TEAM: 38RJUJHKZS - SWIFT_ACTIVE_COMPILATION_CONDITIONS: "$(inherited) APP_STORE" targets: Flowlight: type: application diff --git a/scripts/build-local.sh b/scripts/build-local.sh index 30aa3644..23bafc4e 100755 --- a/scripts/build-local.sh +++ b/scripts/build-local.sh @@ -3,7 +3,6 @@ # Runs on any Mac using the nettop fallback; the embedded extension cannot be activated. set -euo pipefail cd "$(dirname "$0")/.." -command -v xcodegen >/dev/null && xcodegen generate >/dev/null xcodebuild -project Flowlight.xcodeproj -scheme Flowlight -configuration Release -derivedDataPath build \ CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual DEVELOPMENT_TEAM= CODE_SIGN_ENTITLEMENTS= \ build | grep -E "error:|BUILD" diff --git a/scripts/build-signed.sh b/scripts/build-signed.sh index 666cfb08..fbba18cc 100755 --- a/scripts/build-signed.sh +++ b/scripts/build-signed.sh @@ -12,8 +12,6 @@ set -euo pipefail cd "$(dirname "$0")/.." : "${TEAM_ID:?Set TEAM_ID to your Apple Developer team ID}" -command -v xcodegen >/dev/null && xcodegen generate >/dev/null - APP_PROFILE="${APP_PROFILE:-Flowlight Developer ID}" EXT_PROFILE="${EXT_PROFILE:-Flowlight Extension Developer ID}" ARCHIVE=build/Flowlight.xcarchive diff --git a/scripts/check_app_store_product.sh b/scripts/check_app_store_product.sh index bc7ece1d..a2037254 100755 --- a/scripts/check_app_store_product.sh +++ b/scripts/check_app_store_product.sh @@ -6,9 +6,10 @@ repo=$(cd "$(dirname "$0")/.." && pwd) contents="$app/Contents" extension="$contents/PlugIns/com.flowlight.app.filter.appex" app_binary="$contents/MacOS/Flowlight" +extension_binary="$extension/Contents/MacOS/com.flowlight.app.filter" extension_info="$extension/Contents/Info.plist" -app_entitlements="$repo/Flowlight/Flowlight-AppStore.entitlements" -extension_entitlements="$repo/FlowlightExtension/FlowlightExtension-AppStore.entitlements" +temporary=$(mktemp -d "${TMPDIR:-/tmp}/flowlight-store-product.XXXXXX") +trap 'rm -rf "$temporary"' EXIT fail() { echo "App Store product check failed: $*" >&2 @@ -19,17 +20,29 @@ plist_true() { [ "$(/usr/libexec/PlistBuddy -c "Print :$2" "$1" 2>/dev/null)" = true ] } +extract_entitlements() { + local executable=$1 destination=$2 label=$3 + codesign -d --entitlements :- "$executable" > "$destination" 2>/dev/null || + fail "cannot read entitlements from signed Store $label" + plutil -lint "$destination" >/dev/null || fail "Store $label has no readable signed entitlements" +} + +[ -x "$app_binary" ] || fail "missing app executable" +[ -x "$extension_binary" ] || fail "missing embedded content-filter executable" +extract_entitlements "$app_binary" "$temporary/app-entitlements.plist" app +extract_entitlements "$extension_binary" "$temporary/extension-entitlements.plist" extension + # The Store build disables HTTPS inspection: it neither installs a root certificate nor starts the local proxy. -# Nothing in this product listens for inbound connections, so a server entitlement on either executable is a +# Nothing in this product listens for inbound connections, so a server entitlement on either signed executable is a # least-privilege regression and will also stop automated App Review before the submission can proceed. -if /usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "$app_entitlements" >/dev/null 2>&1; then - fail "Store app declares network.server even though Store inspection is disabled" +if /usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "$temporary/app-entitlements.plist" >/dev/null 2>&1; then + fail "signed Store app declares network.server even though Store inspection is disabled" fi -if /usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "$extension_entitlements" >/dev/null 2>&1; then - fail "Store extension declares network.server but has no inbound listener" +if /usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "$temporary/extension-entitlements.plist" >/dev/null 2>&1; then + fail "signed Store extension declares network.server but has no inbound listener" fi -plist_true "$app_entitlements" com.apple.security.network.client || fail "Store app is missing network.client" -plist_true "$extension_entitlements" com.apple.security.network.client || fail "Store extension is missing network.client" +plist_true "$temporary/app-entitlements.plist" com.apple.security.network.client || fail "signed Store app is missing network.client" +plist_true "$temporary/extension-entitlements.plist" com.apple.security.network.client || fail "signed Store extension is missing network.client" ruby -ryaml -e ' project = YAML.safe_load(File.read(ARGV.fetch(0)), aliases: true) @@ -43,7 +56,6 @@ ruby -ryaml -e ' end ' "$repo/project.yml" || fail "Store targets use the wrong entitlement files" -[ -x "$app_binary" ] || fail "missing app executable" [ -d "$extension" ] || fail "missing embedded content-filter app extension" [ ! -d "$contents/Library/SystemExtensions" ] || fail "contains a direct-distribution system extension" [ ! -e "$contents/Library/Helpers/FlowlightResponseScriptHelper" ] || fail "contains the response-script helper" diff --git a/scripts/check_xcode_project.sh b/scripts/check_xcode_project.sh index a990e8a5..57d6b4cf 100755 --- a/scripts/check_xcode_project.sh +++ b/scripts/check_xcode_project.sh @@ -4,9 +4,14 @@ set -euo pipefail cd "$(dirname "$0")/.." command -v xcodegen >/dev/null || { - echo "xcodegen is required (brew install xcodegen)." >&2 + echo "xcodegen 2.46.0 is required — install that version before regenerating the project." >&2 exit 1 } +xcodegen_version=$(xcodegen --version | sed -n 's/^Version: //p') +if [[ "$xcodegen_version" != 2.46.0 ]]; then + echo "xcodegen 2.46.0 is required, found ${xcodegen_version:-unknown}." >&2 + exit 1 +fi mode=${1:-check} if [[ "$mode" != check && "$mode" != --write ]]; then diff --git a/site/pages/releases.html b/site/pages/releases.html index 674a196e..63d71a86 100644 --- a/site/pages/releases.html +++ b/site/pages/releases.html @@ -15,13 +15,12 @@

    What's new

    0.15.7

    Latest
      -
    • Give Xcode Cloud a stable App Store project. The shared XcodeGen project and Store archive scheme are now - committed so Apple can discover the selected container before any cloud build script runs.
    • -
    • Keep the generated project honest. A repeatable drift gate regenerates the project from - project.yml, canonicalizes XcodeGen’s one equivalent copy-phase ordering, and rejects drift in both the working tree - and the exact Git index while continuing to ignore user-specific and Xcode-managed state.
    • Minimize the Store extension’s network access. The sandboxed content filter no longer declares an unused - inbound-listener entitlement, and the Store product gate now rejects that entitlement on either executable.
    • + inbound-listener entitlement. +
    • Validate what will actually ship. The Store product gate now extracts entitlements from the built app and + extension, rejecting forbidden inbound-listener access and missing outbound access on the signed executables themselves.
    • +
    • Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, + CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it.
    From 1a215677d66a8c88db458389c8430ebb8bc8a1c2 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 21:15:24 -0700 Subject: [PATCH 6/9] Preserve local build failures Run xcodebuild directly so output filtering cannot hide its exit status. Co-Authored-By: Claude Code --- scripts/build-local.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/build-local.sh b/scripts/build-local.sh index 23bafc4e..c5d3cc31 100755 --- a/scripts/build-local.sh +++ b/scripts/build-local.sh @@ -4,6 +4,5 @@ set -euo pipefail cd "$(dirname "$0")/.." xcodebuild -project Flowlight.xcodeproj -scheme Flowlight -configuration Release -derivedDataPath build \ - CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual DEVELOPMENT_TEAM= CODE_SIGN_ENTITLEMENTS= \ - build | grep -E "error:|BUILD" + CODE_SIGN_IDENTITY=- CODE_SIGN_STYLE=Manual DEVELOPMENT_TEAM= CODE_SIGN_ENTITLEMENTS= build echo "Built: build/Build/Products/Release/Flowlight.app" From d9ac191b3de74c3ad3faed0f55170dfad0c1c7ab Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 21:26:28 -0700 Subject: [PATCH 7/9] Make tag pushes dry-run only Require an explicit workflow dispatch to publish an immutable tag after its signed and notarized dry run succeeds. Co-Authored-By: Claude Code --- .github/workflows/release.yml | 18 ++++++++---------- CONTRIBUTING.md | 14 ++++++-------- README.md | 4 ++-- docs/DEVELOPMENT.md | 31 ++++++++++++++----------------- docs/llms-full.txt | 3 +++ docs/releases/index.html | 2 ++ site/pages/releases.html | 2 ++ 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b13c434a..b58722e7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,10 +1,8 @@ name: Release -# Builds, signs, notarizes and publishes on a version tag: -# -# git tag -a v0.2.3 -m "Flowlight 0.2.3" && git push origin v0.2.3 -# -# The secrets this needs are listed in docs/DEVELOPMENT.md, along with what it means to keep a signing identity in +# A version-tag push builds, signs, notarizes and verifies without publishing. After that dry run passes, dispatch +# this workflow for the existing tag with dry_run=false to publish it. The secrets this needs are listed in +# docs/DEVELOPMENT.md, along with what it means to keep a signing identity in # GitHub. Without them the job fails at the import step rather than publishing something unsigned. # # It runs without waiting for an approval. What gates it instead: the release environment only accepts v* tags, @@ -223,7 +221,7 @@ jobs: ( cd build && shasum -a 256 Flowlight.dmg "Flowlight-$VERSION.pkg" | tee SHA256SUMS.txt ) - name: Publish the release - if: ${{ github.event.inputs.dry_run != 'true' }} + if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.dry_run != 'true' }} env: GH_TOKEN: ${{ github.token }} run: | @@ -257,7 +255,7 @@ jobs: # was invisible because verification used to pass when it found nothing. Checked against the published # release rather than the build directory, because what matters is what people can actually download. - name: The release must carry the checksums the updater looks for - if: ${{ github.event.inputs.dry_run != 'true' }} + if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.dry_run != 'true' }} env: GH_TOKEN: ${{ github.token }} run: | @@ -281,7 +279,7 @@ jobs: # The cask points at the release that was just published, so this runs last. - name: Update the Homebrew cask - if: ${{ env.TAP_TOKEN != '' && github.event.inputs.dry_run != 'true' }} + if: ${{ env.TAP_TOKEN != '' && github.event_name == 'workflow_dispatch' && github.event.inputs.dry_run != 'true' }} run: | set -euo pipefail git clone "https://x-access-token:$TAP_TOKEN@github.com/xinbetween/homebrew-tap.git" "$RUNNER_TEMP/tap" @@ -291,7 +289,7 @@ jobs: git -C "$RUNNER_TEMP/tap" push - name: Say what a dry run produced - if: ${{ github.event.inputs.dry_run == 'true' }} + if: ${{ github.event_name == 'push' || github.event.inputs.dry_run == 'true' }} run: | set -euo pipefail VERSION="${{ steps.version.outputs.version }}" @@ -302,6 +300,6 @@ jobs: echo '```' cat build/SHA256SUMS.txt echo '```' - echo "Re-run without **dry_run** to publish \`${{ steps.version.outputs.tag }}\`." + echo "Dispatch this workflow for \`${{ steps.version.outputs.tag }}\` with **dry_run=false** to publish." } >> "$GITHUB_STEP_SUMMARY" echo "Dry run complete — Flowlight $VERSION built and verified, nothing published." diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 68d00514..b023153a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,11 +68,9 @@ gh pr create --base main --title "Flowlight 0.13.4" # wait for review and every required PR check to pass git tag -a v0.13.4 -m "Flowlight 0.13.4" -git push origin v0.13.4 -# cancel the automatic publish run, then exercise the immutable tag first: -gh workflow run Release --ref v0.13.4 -f dry_run=true -# inspect the successful signed/notarized/Gatekeeper dry run, then publish from the same tag: -gh workflow run Release --ref v0.13.4 +git push origin v0.13.4 # automatically runs the signed dry run; it cannot publish +# inspect that successful signed/notarized/Gatekeeper run, then publish from the same tag: +gh workflow run Release --ref v0.13.4 -f tag=v0.13.4 # verify the GitHub release, DMG, PKG and SHA256SUMS.txt before the final merge gh pr merge --merge --delete-branch ``` @@ -85,9 +83,9 @@ will be signed. Publishing before merging keeps the GitHub Pages site from annou `docs/` is served from `main`, its Download button resolves to the latest GitHub release, CI requires `docs/` to match `site/`, and the site builder reads `MARKETING_VERSION`. -A tag push starts `release.yml`; cancel that automatic publication before it reaches its publish step and dispatch the -dry run from the immutable tag. A dry run must prove tests, signing, notarization and Gatekeeper verification before a -production dispatch is allowed. After production succeeds, verify the release page and downloaded DMG, PKG and +A tag push starts `release.yml` in dry-run-only mode; push-triggered runs cannot publish. It must prove tests, signing, +notarization and Gatekeeper verification before an explicit production dispatch for that immutable tag. After production +succeeds, verify the release page and downloaded DMG, PKG and `SHA256SUMS.txt` checksums, then merge the release PR into `main`. [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md#release-branches) documents the signing inputs and workflow internals. diff --git a/README.md b/README.md index c056a627..fc1bc212 100644 --- a/README.md +++ b/README.md @@ -513,8 +513,8 @@ feature branch → release branch → reviewed green PR → immutable tag → si green. 4. Create and push an annotated `v` tag on that exact release commit. Tags are immutable: never retag, move or force-push one. If it is wrong, issue the next patch release instead. -5. Run the signed/notarized/Gatekeeper **dry run from that tag** before production publication. Then publish from the - same tag. +5. The tag push automatically runs the signed/notarized/Gatekeeper **dry run** and cannot publish. After it passes, + explicitly dispatch production for that same tag. 6. Verify the GitHub release and its DMG, PKG and `SHA256SUMS.txt` assets/checksums. Only then merge the release PR into `main`, allowing GitHub Pages to advertise the downloadable release. diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 5509af4d..52bac8d8 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -414,12 +414,9 @@ gh pr create --base main --title "Flowlight 0.13.4" # wait for review and every required PR check to pass git tag -a v0.13.4 -m "Flowlight 0.13.4" -git push origin v0.13.4 -# cancel the automatic publish run, then exercise the immutable tag first: -gh run cancel -gh workflow run Release --ref v0.13.4 -f dry_run=true -# inspect the successful signed/notarized/Gatekeeper dry run, then publish from the same tag: -gh workflow run Release --ref v0.13.4 +git push origin v0.13.4 # automatically runs the signed dry run; it cannot publish +# inspect that successful signed/notarized/Gatekeeper run, then publish from the same tag: +gh workflow run Release --ref v0.13.4 -f tag=v0.13.4 # verify the GitHub release, DMG, PKG and SHA256SUMS.txt before the final merge gh pr merge --merge --delete-branch ``` @@ -429,22 +426,22 @@ comes after publication so the site can only ever describe something downloadabl force-push or move a pushed version. If a tag is wrong or a release needs another change, bump the patch version and begin a new release branch and tag. -A tag push starts `release.yml` automatically. Cancel that run before it publishes, then dispatch the signed dry run -from the immutable tag. The dry run must build, sign, notarize and pass Gatekeeper verification before production -publication is allowed. After production succeeds, verify the GitHub release page and downloaded DMG, PKG and +A tag push starts `release.yml` automatically in dry-run-only mode; push-triggered runs cannot publish. It must build, +sign, notarize and pass Gatekeeper verification before an explicit production dispatch for the immutable tag. After +production succeeds, verify the GitHub release page and downloaded DMG, PKG and `SHA256SUMS.txt` checksums before merging the release PR. ## Releasing from CI -`.github/workflows/release.yml` does all of the above on a version tag: it checks the tag matches -`MARKETING_VERSION`, runs the tests, signs, notarizes, verifies with `spctl`, publishes the release and updates the -Homebrew cask. `.github/workflows/ci.yml` builds and tests every push and pull request, and fails if `docs/` is out +`.github/workflows/release.yml` checks the tag matches `MARKETING_VERSION`, runs the tests, signs, notarizes and +verifies with `spctl`. A tag push always stops there; an explicit dispatch for that tag publishes the release and updates +the Homebrew cask. `.github/workflows/ci.yml` builds and tests every push and pull request, and fails if `docs/` is out of date with `site/`. ```sh scripts/ci-secrets.sh # upload the secrets once -git tag -a v0.3.0 -m "Flowlight 0.3.0" && git push origin v0.3.0 -gh workflow run Release --ref v0.3.0 -f dry_run=true # build and verify, publish nothing +git tag -a v0.3.0 -m "Flowlight 0.3.0" && git push origin v0.3.0 # automatic dry run +gh workflow run Release --ref v0.3.0 -f tag=v0.3.0 # after it passes: publish ``` `--ref` has to name a tag whose tree *contains* the workflow: `gh` reads the workflow file from the ref you give @@ -452,9 +449,9 @@ it, so tags older than `.github/workflows/release.yml` fail with "Workflow does trigger". The environment only accepts `v*` tags, so dispatching from a branch is refused at the approval gate — which is the point of it. -**dry_run** builds, signs, notarizes and asks Gatekeeper for a verdict, then stops without creating a release or -touching the cask. It is the safe way to exercise the path the first time, or after changing anything about -signing. +A tag push—and an explicit dispatch with **dry_run=true**—builds, signs, notarizes and asks Gatekeeper for a verdict, +then stops without creating a release or touching the cask. Production requires an explicit dispatch with the tag input +and **dry_run=false**. Release notes come from `packaging/release-notes/.md` when that file exists (checksums are appended), and from generated notes when it doesn't. diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 1659fb29..9cf4cd18 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -1641,6 +1641,9 @@ October 25, 2026Latest Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it. + Make release ordering deterministic. Tag pushes can only run the signed, notarized dry run; publishing now + requires an explicit dispatch for that immutable tag after verification succeeds. + 0.15.6 October 23, 2026 diff --git a/docs/releases/index.html b/docs/releases/index.html index 4b0df852..a58bca41 100644 --- a/docs/releases/index.html +++ b/docs/releases/index.html @@ -69,6 +69,8 @@

    What's new

    extension, rejecting forbidden inbound-listener access and missing outbound access on the signed executables themselves.
  • Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it.
  • +
  • Make release ordering deterministic. Tag pushes can only run the signed, notarized dry run; publishing now + requires an explicit dispatch for that immutable tag after verification succeeds.
diff --git a/site/pages/releases.html b/site/pages/releases.html index 63d71a86..e23db178 100644 --- a/site/pages/releases.html +++ b/site/pages/releases.html @@ -21,6 +21,8 @@

What's new

extension, rejecting forbidden inbound-listener access and missing outbound access on the signed executables themselves.
  • Keep distribution graphs isolated. Store-only compilation flags are scoped to Store targets, and release, CodeQL, and local build paths consume the exact committed project reviewed by CI instead of regenerating it.
  • +
  • Make release ordering deterministic. Tag pushes can only run the signed, notarized dry run; publishing now + requires an explicit dispatch for that immutable tag after verification succeeds.
  • From ce558314b40eada66384e1a8f6c5c95e08a6ff69 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 21:28:15 -0700 Subject: [PATCH 8/9] Verify committed release metadata Reject tags whose reviewed Xcode project targets do not match project.yml version and build metadata before testing or signing. Co-Authored-By: Claude Code --- .github/workflows/release.yml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b58722e7..e38c51d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -64,9 +64,13 @@ jobs: - name: Read the version and check it matches the tag id: version run: | + set -euo pipefail VERSION=$(sed -n 's/.*MARKETING_VERSION:[[:space:]]*"\(.*\)".*/\1/p' project.yml) + BUILD=$(sed -n 's/.*CURRENT_PROJECT_VERSION:[[:space:]]*"\(.*\)".*/\1/p' project.yml) TAG="${{ github.event.inputs.tag || github.ref_name }}" + [[ -n "$VERSION" && -n "$BUILD" ]] || { echo "::error::Missing version metadata in project.yml."; exit 1; } echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "build=$BUILD" >> "$GITHUB_OUTPUT" echo "tag=$TAG" >> "$GITHUB_OUTPUT" if [[ "$TAG" != "v$VERSION" ]]; then echo "::error::Tag $TAG doesn't match MARKETING_VERSION $VERSION in project.yml." @@ -80,8 +84,22 @@ jobs: sudo xcode-select -s "$(ls -d /Applications/Xcode*.app | sort -V | tail -1)" xcodebuild -version - # The committed project is the exact graph reviewed by CI and selected by Xcode Cloud. Release builds consume - # it directly; regeneration belongs only in the explicit drift gate before the commit is tagged. + # The committed project is the exact graph reviewed by CI and selected by Xcode Cloud. Verify its release + # metadata before consuming it so a stale project can never publish under a newer project.yml/tag. + - name: Check committed project version + run: | + set -euo pipefail + for target in Flowlight FlowlightAppStore; do + settings="$RUNNER_TEMP/$target-settings.txt" + xcodebuild -project Flowlight.xcodeproj -target "$target" -configuration Release -showBuildSettings > "$settings" + project_version=$(sed -n 's/^[[:space:]]*MARKETING_VERSION = //p' "$settings") + project_build=$(sed -n 's/^[[:space:]]*CURRENT_PROJECT_VERSION = //p' "$settings") + if [[ "$project_version" != "${{ steps.version.outputs.version }}" || "$project_build" != "${{ steps.version.outputs.build }}" ]]; then + echo "::error::$target committed project is $project_version/$project_build; project.yml is ${{ steps.version.outputs.version }}/${{ steps.version.outputs.build }}." + exit 1 + fi + done + - name: Test timeout-minutes: 40 run: | From 7574dd00bcda19c90d74ba602056de2678ba9940 Mon Sep 17 00:00:00 2001 From: blessdyb Date: Sun, 25 Oct 2026 21:33:07 -0700 Subject: [PATCH 9/9] Restore release test retry Disable inherited errexit while capturing xcodebuild status so a timed-out first attempt reaches the documented retry and final failures still exit explicitly. Co-Authored-By: Claude Code --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e38c51d7..564e7b64 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,6 +103,9 @@ jobs: - name: Test timeout-minutes: 40 run: | + # GitHub starts run blocks with bash -e. This step records the first attempt's status so it can retry a + # timeout, then exits explicitly if the final attempt failed. + set +e set -uo pipefail # xcodebuild occasionally never returns here — the same suite passes locally and on most runs, and the # per-test allowance below doesn't always catch it, so the whole invocation gets a watchdog. One retry: