@agimon-ai/vibe-lint-plugin-po-extension 0.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/configs/patterns.cjs +2 -0
  5. package/dist/configs/patterns.cjs.map +1 -0
  6. package/dist/configs/patterns.mjs +2 -0
  7. package/dist/configs/patterns.mjs.map +1 -0
  8. package/dist/configs/recommended.cjs +2 -0
  9. package/dist/configs/recommended.cjs.map +1 -0
  10. package/dist/configs/recommended.d.mts +6 -0
  11. package/dist/configs/recommended.d.mts.map +1 -0
  12. package/dist/configs/recommended.mjs +2 -0
  13. package/dist/configs/recommended.mjs.map +1 -0
  14. package/dist/index.cjs +1 -0
  15. package/dist/index.d.mts +12 -0
  16. package/dist/index.mjs +1 -0
  17. package/dist/plugin.cjs +2 -0
  18. package/dist/plugin.cjs.map +1 -0
  19. package/dist/plugin.d.mts +5 -0
  20. package/dist/plugin.d.mts.map +1 -0
  21. package/dist/plugin.mjs +2 -0
  22. package/dist/plugin.mjs.map +1 -0
  23. package/dist/rules/architecture.cjs +2 -0
  24. package/dist/rules/architecture.cjs.map +1 -0
  25. package/dist/rules/architecture.d.mts +20 -0
  26. package/dist/rules/architecture.d.mts.map +1 -0
  27. package/dist/rules/architecture.mjs +2 -0
  28. package/dist/rules/architecture.mjs.map +1 -0
  29. package/dist/rules/compositionLayout.cjs +2 -0
  30. package/dist/rules/compositionLayout.cjs.map +1 -0
  31. package/dist/rules/compositionLayout.mjs +2 -0
  32. package/dist/rules/compositionLayout.mjs.map +1 -0
  33. package/dist/rules/constants.cjs +2 -0
  34. package/dist/rules/constants.cjs.map +1 -0
  35. package/dist/rules/constants.d.mts +1 -0
  36. package/dist/rules/constants.mjs +2 -0
  37. package/dist/rules/constants.mjs.map +1 -0
  38. package/dist/rules/conventions.cjs +3 -0
  39. package/dist/rules/conventions.cjs.map +1 -0
  40. package/dist/rules/conventions.d.mts +15 -0
  41. package/dist/rules/conventions.d.mts.map +1 -0
  42. package/dist/rules/conventions.mjs +3 -0
  43. package/dist/rules/conventions.mjs.map +1 -0
  44. package/dist/rules/edgePortable.cjs +2 -0
  45. package/dist/rules/edgePortable.cjs.map +1 -0
  46. package/dist/rules/edgePortable.mjs +2 -0
  47. package/dist/rules/edgePortable.mjs.map +1 -0
  48. package/dist/rules/extensionLayout.cjs +2 -0
  49. package/dist/rules/extensionLayout.cjs.map +1 -0
  50. package/dist/rules/extensionLayout.mjs +2 -0
  51. package/dist/rules/extensionLayout.mjs.map +1 -0
  52. package/dist/rules/index.d.mts +13 -0
  53. package/dist/rules/manifestEntries.cjs +2 -0
  54. package/dist/rules/manifestEntries.cjs.map +1 -0
  55. package/dist/rules/manifestEntries.mjs +2 -0
  56. package/dist/rules/manifestEntries.mjs.map +1 -0
  57. package/dist/rules/neutralContracts.cjs +2 -0
  58. package/dist/rules/neutralContracts.cjs.map +1 -0
  59. package/dist/rules/neutralContracts.d.mts +1 -0
  60. package/dist/rules/neutralContracts.mjs +2 -0
  61. package/dist/rules/neutralContracts.mjs.map +1 -0
  62. package/dist/rules/packageApi.cjs +2 -0
  63. package/dist/rules/packageApi.cjs.map +1 -0
  64. package/dist/rules/packageApi.d.mts +9 -0
  65. package/dist/rules/packageApi.d.mts.map +1 -0
  66. package/dist/rules/packageApi.mjs +2 -0
  67. package/dist/rules/packageApi.mjs.map +1 -0
  68. package/dist/rules/piExtensionContract.cjs +3 -0
  69. package/dist/rules/piExtensionContract.cjs.map +1 -0
  70. package/dist/rules/piExtensionContract.d.mts +5 -0
  71. package/dist/rules/piExtensionContract.d.mts.map +1 -0
  72. package/dist/rules/piExtensionContract.mjs +3 -0
  73. package/dist/rules/piExtensionContract.mjs.map +1 -0
  74. package/dist/rules/pluginWiring.cjs +2 -0
  75. package/dist/rules/pluginWiring.cjs.map +1 -0
  76. package/dist/rules/pluginWiring.d.mts +2 -0
  77. package/dist/rules/pluginWiring.mjs +2 -0
  78. package/dist/rules/pluginWiring.mjs.map +1 -0
  79. package/dist/rules/prompts.cjs +3 -0
  80. package/dist/rules/prompts.cjs.map +1 -0
  81. package/dist/rules/prompts.d.mts +5 -0
  82. package/dist/rules/prompts.d.mts.map +1 -0
  83. package/dist/rules/prompts.mjs +3 -0
  84. package/dist/rules/prompts.mjs.map +1 -0
  85. package/dist/rules/registry.cjs +2 -0
  86. package/dist/rules/registry.cjs.map +1 -0
  87. package/dist/rules/registry.d.mts +5 -0
  88. package/dist/rules/registry.d.mts.map +1 -0
  89. package/dist/rules/registry.mjs +2 -0
  90. package/dist/rules/registry.mjs.map +1 -0
  91. package/dist/rules/resourceKind.cjs +2 -0
  92. package/dist/rules/resourceKind.cjs.map +1 -0
  93. package/dist/rules/resourceKind.d.mts +1 -0
  94. package/dist/rules/resourceKind.mjs +2 -0
  95. package/dist/rules/resourceKind.mjs.map +1 -0
  96. package/dist/rules/webPlugin.cjs +2 -0
  97. package/dist/rules/webPlugin.cjs.map +1 -0
  98. package/dist/rules/webPlugin.d.mts +9 -0
  99. package/dist/rules/webPlugin.d.mts.map +1 -0
  100. package/dist/rules/webPlugin.mjs +2 -0
  101. package/dist/rules/webPlugin.mjs.map +1 -0
  102. package/dist/rules/webPluginTools.cjs +2 -0
  103. package/dist/rules/webPluginTools.cjs.map +1 -0
  104. package/dist/rules/webPluginTools.d.mts +5 -0
  105. package/dist/rules/webPluginTools.d.mts.map +1 -0
  106. package/dist/rules/webPluginTools.mjs +2 -0
  107. package/dist/rules/webPluginTools.mjs.map +1 -0
  108. package/package.json +66 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Vuong Ngo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # @agimon-ai/vibe-lint-plugin-po-extension
2
+
3
+ Deterministic Vibe-Lint rules for publishable Po extension packages.
4
+
5
+ This package is alpha software. Its rules and package contracts may change between alpha releases. It requires Node.js 24 or newer and the `@agimon-ai/vibe-lint` peer version declared in its package metadata.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add -D @agimon-ai/vibe-lint @agimon-ai/vibe-lint-plugin-po-extension
11
+ ```
12
+
13
+ This installs the Vibe-Lint CLI and the Po extension rule plugin as development dependencies.
14
+
15
+ ## Configure
16
+
17
+ Add the plugin and one preset to `vibe-lint.config.yaml`:
18
+
19
+ ```yaml
20
+ plugins:
21
+ - core
22
+ - po-extension
23
+
24
+ extends:
25
+ - core/recommended
26
+ - po-extension/recommended
27
+ ```
28
+
29
+ Vibe-Lint resolves the short name `po-extension` to this package. The recommended preset enables the extension contract at error severity. For an existing package migration, replace `po-extension/recommended` with `po-extension/migration`. The migration preset enables the same rules at warning severity.
30
+
31
+ Run the configured checks with:
32
+
33
+ ```bash
34
+ pnpm exec vibe-lint check .
35
+ ```
36
+
37
+ The command checks the current directory using its resolved Vibe-Lint configuration. The plugin reports violations but does not rewrite package files.
38
+
39
+ ## Enforced package contracts
40
+
41
+ The preset checks the canonical Po source layout, layer dependencies, public exports, schemas, services, peer versions, Cordis ownership, lifecycle cleanup, package metadata, optional HTTP APIs, and optional web cockpit plugins.
42
+
43
+ ### Help prompts
44
+
45
+ Package-owned Help prompts live at `src/prompts/<prompt-name>/SKILL.md`. The `po-prompt-shape` rule checks the prompt directory name, frontmatter, `llms.txt` link, and publish allowlist entry. A prompt may keep support material in adjacent `references`, `scripts`, `assets`, and `agents` directories.
46
+
47
+ ### Source structure and public entries
48
+
49
+ - `src/extensions/server.ts` and `web.ts` are direct host entries, built or source-bundled without export wrappers.
50
+ - `src/controllers/` translates API, typed method, and command requests into service calls.
51
+ - `src/services/{serviceName}/index.ts` owns package logic; its `type.ts` owns local service contracts. Filesystem, network, process work, and Cordis service implementations belong here.
52
+ - `src/models/` owns state; `src/tools/` declares tools that consume services and models.
53
+ - `src/constants/`, `src/schemas/`, and `src/types/` hold shared data, validation, and cross-capability types.
54
+ - Flat `src/exports/*.ts` modules expose selected reusable capabilities through pure re-exports. They do not forward extension, browser, or executable entries.
55
+ - `src/web/` and `src/bin/` retain browser presentation and standalone executable composition.
56
+
57
+ The preset rejects `adapters`, `container`, `containers`, `commands`, and `providers` source roots. It also rejects nested exports and imports through old compatibility wrappers. Relative imports omit file extensions and `/index`; `clean-import-path` is enabled at error severity.
58
+
59
+ Dependencies point inward: controllers and tools consume services/models, services consume models and other services, models consume schemas/types/constants, schemas consume types/constants, and types consume constants. Extension and executable roots assemble the graph without importing public export wrappers or each other. The direct web entry retains the same browser-safe dependencies as `src/web`.
60
+
61
+ ### Plugin lifecycle and HTTP APIs
62
+
63
+ Server lifecycle hooks are optional: `onStart` runs after registration, `onStop` stops work before registrations are removed, and `onDispose` releases final instance resources. The helper awaits startup, aborts the instance signal during shutdown, owns registration cleanup, and rolls back failed mounts.
64
+
65
+ HTTP controllers export `PoApi` declarations for the server plugin's `api` arrays. Declare one `poServer` block with `entry: './src/extensions/server.ts'`, its built dist path, and supported `global`, `workspace`, and `session` scopes. The `package-api-manifest` rule rejects the legacy `poApi` field. Browser composition lives directly at `src/extensions/web.ts`, referenced by `poWeb.client` and bundled from source.
66
+
67
+ ### Cordis and runtime ownership
68
+
69
+ The shared helpers own the runner host, leases, child fibers, and cleanup. Feature entries declare capabilities without creating a Cordis Context or manually acquiring a host lease. Service implementations publish from their owned context. Required service consumption belongs in an owning injection; bindings must be released when their provider disappears.
70
+
71
+ Same-runner runtime protocol imports and live `global` or `globalThis` capability registries are rejected. Reload handoff and bootstrap claims remain narrow runtime exceptions with their existing lifetime and identity checks.
72
+
73
+ ## Public API
74
+
75
+ The default export is the Vibe-Lint plugin contract. Named exports include `poExtensionPlugin`, `rules`, `recommended`, `migration`, and the rule definitions re-exported by the package entry point.
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));exports.__toESM=s;
@@ -0,0 +1,2 @@
1
+ const e={"po-exports":{description:`Flat public consumption modules exposing selected services, constants, types, schemas, and other reusable capabilities. Pure re-exports only. Host entries live directly in src/extensions; never re-export them here.`,includes:[`src/exports/*.ts`]},"po-constants":{description:`Shared literal data, command metadata, and guidance. Constants import only constants and contain no implementations. Every layer, including browser code, may import constants.`,includes:[`src/constants/**/*.ts`]},"po-types":{description:`Host-neutral contracts and option shapes. Imports only types and constants.`,includes:[`src/types/**/*.ts`]},"po-schemas":{description:`Runtime TypeBox and Zod validation contracts. Transport protocols are reserved for real process/reload boundaries; same-runner package capabilities are named Cordis services.`,includes:[`src/schemas/**/*.ts`]},"po-services":{description:`Package logic, including filesystem, network, process integration, and Cordis service implementations. Each service has src/services/{serviceName}/index.ts and type.ts for local contracts. Services never import extension entries. Keep dependencies explicit so behavior can be tested independently.`,includes:[`src/services/**/*.ts`]},"po-prompts":{description:`Package-owned Help resources. Each direct child is a kebab-case skill directory with one SKILL.md indexed by llms.txt and shipped through the package files allowlist.`,includes:[`src/prompts/**`]},"po-models":{description:`Package state and state transitions. Models import constants, models, schemas, and types; services and routed declarations consume them.`,includes:[`src/models/**/*.ts`]},"po-extensions":{description:`Folder-routed files default-export exactly one typed define declaration. Their path states scope, side, surface, and identity. Use root files for shared mount state and lifecycle, services for implementation, and private colocated _lib or _components for surface-private code. Named exports never live in scanned route files. Cardinality is declared through defineRoutedContribution options rather than pseudo-surface names or catch-all files.`,includes:[`src/extensions/**/*.ts`]},"po-bin":{description:`Executable composition entrypoints declared in package.json bin. Assemble services directly without importing public export wrappers or extension entries.`,includes:[`src/bin/**/*.ts`]},"po-web-plugin-store":{description:"Per-session plugin state, in the private `_lib` folder beside the routed file that reads it: one `defineSessionStore<T>(empty)` per topic, where T is the whole record for a session (the hub's last payload plus this page's own ephemeral state such as dismissed ids or the open run). The channel is `store.channel({ channel, parse, reduce })`: parse gates the wire, reduce folds one payload and reconciles the ephemeral fields; drop and reset belong to the helper. Actions are plain functions calling `store.update`, and one that sends takes a `SessionFrameSender` first. No top-level let.",includes:[`src/extensions/**/_lib/**/*Store.ts`]},"po-web-plugin-components":{description:"Panels, activity sections, overlays, and tool messages, in the private `_components` folder beside the routed file that renders them. A tool message is a `message` renderer, one component per claimed tool receiving ToolMessageRenderProps, composed from MessageItem, MessageItemHeader, MessageItemBody, MessageItemStatus, and MessageLines from @agimon-ai/po-web-components: the shell owns the frame, the outcome tone, the status badge, and the expand toggle (`expandable` when the card hides lines), the card supplies the header summary and the body. Every native tool the package registers is listed in a toolRenderers entry (web-plugin-tool-renderers). Read with `useStore(x.store, (state) => x.select(state, sessionId))`, act with `props.sendSessionFrame`, navigate with `props.openTab`, render own slots with `props.renderSlot`. Tailwind classes as complete literals; imports limited to react, the two TanStack packages, the web contract, the shared components, its own colocated `_components` and `_lib` files, src/types/**, and src/constants/**; plugins never import each other.",includes:[`src/extensions/**/_components/**/*.tsx`]},"po-web-plugin-lib":{description:"Pure view logic the colocated components share, in the private `_lib` folder beside them: formatting, matching, folding. Host-neutral, no React state, no module-level mutable state, tested from tests/ directly.",includes:[`src/extensions/**/_lib/**/*.ts`]},"po-tests":{description:`Unit, integration, and package-contract verification.`,includes:[`tests/**/*.ts`]},"po-metadata":{description:`Publishable package, documentation, and build configuration.`,includes:[`.oxlintrc.json`,`CHANGELOG.md`,`LICENSE`,`README.md`,`llms.txt`,`package.json`,`project.json`,`tsconfig.json`,`tsdown.config.ts`,`vitest.config.ts`,`vibe-lint.config.yaml`]}};exports.patterns=e;
2
+ //# sourceMappingURL=patterns.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.cjs","names":["patterns"],"sources":["../../src/configs/patterns.ts"],"sourcesContent":["import type { PatternDefinition } from '@agimon-ai/vibe-lint';\n\n/**\n * Design-pattern context surfaced before a Po package file is edited. These\n * mirror the canonical source vocabulary in ../rules/architecture.ts, so a\n * package gets the guidance without restating it in its own configuration.\n */\nexport const patterns: Record<string, PatternDefinition> = {\n 'po-exports': {\n description:\n 'Flat public consumption modules exposing selected services, constants, types, schemas, and other reusable capabilities. Pure re-exports only. Host entries live directly in src/extensions; never re-export them here.',\n includes: ['src/exports/*.ts'],\n },\n 'po-constants': {\n description:\n 'Shared literal data, command metadata, and guidance. Constants import only constants and contain no implementations. Every layer, including browser code, may import constants.',\n includes: ['src/constants/**/*.ts'],\n },\n 'po-types': {\n description: 'Host-neutral contracts and option shapes. Imports only types and constants.',\n includes: ['src/types/**/*.ts'],\n },\n 'po-schemas': {\n description:\n 'Runtime TypeBox and Zod validation contracts. Transport protocols are reserved for real process/reload boundaries; same-runner package capabilities are named Cordis services.',\n includes: ['src/schemas/**/*.ts'],\n },\n 'po-services': {\n description:\n 'Package logic, including filesystem, network, process integration, and Cordis service implementations. Each service has src/services/{serviceName}/index.ts and type.ts for local contracts. Services never import extension entries. Keep dependencies explicit so behavior can be tested independently.',\n includes: ['src/services/**/*.ts'],\n },\n 'po-prompts': {\n description:\n 'Package-owned Help resources. Each direct child is a kebab-case skill directory with one SKILL.md indexed by llms.txt and shipped through the package files allowlist.',\n includes: ['src/prompts/**'],\n },\n 'po-models': {\n description:\n 'Package state and state transitions. Models import constants, models, schemas, and types; services and routed declarations consume them.',\n includes: ['src/models/**/*.ts'],\n },\n 'po-extensions': {\n description:\n 'Folder-routed files default-export exactly one typed define declaration. Their path states scope, side, surface, and identity. Use root files for shared mount state and lifecycle, services for implementation, and private colocated _lib or _components for surface-private code. Named exports never live in scanned route files. Cardinality is declared through defineRoutedContribution options rather than pseudo-surface names or catch-all files.',\n includes: ['src/extensions/**/*.ts'],\n },\n 'po-bin': {\n description:\n 'Executable composition entrypoints declared in package.json bin. Assemble services directly without importing public export wrappers or extension entries.',\n includes: ['src/bin/**/*.ts'],\n },\n 'po-web-plugin-store': {\n description:\n \"Per-session plugin state, in the private `_lib` folder beside the routed file that reads it: one `defineSessionStore<T>(empty)` per topic, where T is the whole record for a session (the hub's last payload plus this page's own ephemeral state such as dismissed ids or the open run). The channel is `store.channel({ channel, parse, reduce })`: parse gates the wire, reduce folds one payload and reconciles the ephemeral fields; drop and reset belong to the helper. Actions are plain functions calling `store.update`, and one that sends takes a `SessionFrameSender` first. No top-level let.\",\n includes: ['src/extensions/**/_lib/**/*Store.ts'],\n },\n 'po-web-plugin-components': {\n description:\n 'Panels, activity sections, overlays, and tool messages, in the private `_components` folder beside the routed file that renders them. A tool message is a `message` renderer, one component per claimed tool receiving ToolMessageRenderProps, composed from MessageItem, MessageItemHeader, MessageItemBody, MessageItemStatus, and MessageLines from @agimon-ai/po-web-components: the shell owns the frame, the outcome tone, the status badge, and the expand toggle (`expandable` when the card hides lines), the card supplies the header summary and the body. Every native tool the package registers is listed in a toolRenderers entry (web-plugin-tool-renderers). Read with `useStore(x.store, (state) => x.select(state, sessionId))`, act with `props.sendSessionFrame`, navigate with `props.openTab`, render own slots with `props.renderSlot`. Tailwind classes as complete literals; imports limited to react, the two TanStack packages, the web contract, the shared components, its own colocated `_components` and `_lib` files, src/types/**, and src/constants/**; plugins never import each other.',\n includes: ['src/extensions/**/_components/**/*.tsx'],\n },\n 'po-web-plugin-lib': {\n description:\n 'Pure view logic the colocated components share, in the private `_lib` folder beside them: formatting, matching, folding. Host-neutral, no React state, no module-level mutable state, tested from tests/ directly.',\n includes: ['src/extensions/**/_lib/**/*.ts'],\n },\n 'po-tests': {\n description: 'Unit, integration, and package-contract verification.',\n includes: ['tests/**/*.ts'],\n },\n 'po-metadata': {\n description: 'Publishable package, documentation, and build configuration.',\n includes: [\n '.oxlintrc.json',\n 'CHANGELOG.md',\n 'LICENSE',\n 'README.md',\n 'llms.txt',\n 'package.json',\n 'project.json',\n 'tsconfig.json',\n 'tsdown.config.ts',\n 'vitest.config.ts',\n 'vibe-lint.config.yaml',\n ],\n },\n};\n"],"mappings":"AAOA,MAAaA,EAA8C,CACzD,aAAc,CACZ,YACE,yNACF,SAAU,CAAC,kBAAkB,CAC/B,EACA,eAAgB,CACd,YACE,kLACF,SAAU,CAAC,uBAAuB,CACpC,EACA,WAAY,CACV,YAAa,8EACb,SAAU,CAAC,mBAAmB,CAChC,EACA,aAAc,CACZ,YACE,iLACF,SAAU,CAAC,qBAAqB,CAClC,EACA,cAAe,CACb,YACE,4SACF,SAAU,CAAC,sBAAsB,CACnC,EACA,aAAc,CACZ,YACE,yKACF,SAAU,CAAC,gBAAgB,CAC7B,EACA,YAAa,CACX,YACE,2IACF,SAAU,CAAC,oBAAoB,CACjC,EACA,gBAAiB,CACf,YACE,8bACF,SAAU,CAAC,wBAAwB,CACrC,EACA,SAAU,CACR,YACE,6JACF,SAAU,CAAC,iBAAiB,CAC9B,EACA,sBAAuB,CACrB,YACE,8kBACF,SAAU,CAAC,qCAAqC,CAClD,EACA,2BAA4B,CAC1B,YACE,8jCACF,SAAU,CAAC,wCAAwC,CACrD,EACA,oBAAqB,CACnB,YACE,qNACF,SAAU,CAAC,gCAAgC,CAC7C,EACA,WAAY,CACV,YAAa,wDACb,SAAU,CAAC,eAAe,CAC5B,EACA,cAAe,CACb,YAAa,+DACb,SAAU,CACR,iBACA,eACA,UACA,YACA,WACA,eACA,eACA,gBACA,mBACA,mBACA,uBACF,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e={"po-exports":{description:`Flat public consumption modules exposing selected services, constants, types, schemas, and other reusable capabilities. Pure re-exports only. Host entries live directly in src/extensions; never re-export them here.`,includes:[`src/exports/*.ts`]},"po-constants":{description:`Shared literal data, command metadata, and guidance. Constants import only constants and contain no implementations. Every layer, including browser code, may import constants.`,includes:[`src/constants/**/*.ts`]},"po-types":{description:`Host-neutral contracts and option shapes. Imports only types and constants.`,includes:[`src/types/**/*.ts`]},"po-schemas":{description:`Runtime TypeBox and Zod validation contracts. Transport protocols are reserved for real process/reload boundaries; same-runner package capabilities are named Cordis services.`,includes:[`src/schemas/**/*.ts`]},"po-services":{description:`Package logic, including filesystem, network, process integration, and Cordis service implementations. Each service has src/services/{serviceName}/index.ts and type.ts for local contracts. Services never import extension entries. Keep dependencies explicit so behavior can be tested independently.`,includes:[`src/services/**/*.ts`]},"po-prompts":{description:`Package-owned Help resources. Each direct child is a kebab-case skill directory with one SKILL.md indexed by llms.txt and shipped through the package files allowlist.`,includes:[`src/prompts/**`]},"po-models":{description:`Package state and state transitions. Models import constants, models, schemas, and types; services and routed declarations consume them.`,includes:[`src/models/**/*.ts`]},"po-extensions":{description:`Folder-routed files default-export exactly one typed define declaration. Their path states scope, side, surface, and identity. Use root files for shared mount state and lifecycle, services for implementation, and private colocated _lib or _components for surface-private code. Named exports never live in scanned route files. Cardinality is declared through defineRoutedContribution options rather than pseudo-surface names or catch-all files.`,includes:[`src/extensions/**/*.ts`]},"po-bin":{description:`Executable composition entrypoints declared in package.json bin. Assemble services directly without importing public export wrappers or extension entries.`,includes:[`src/bin/**/*.ts`]},"po-web-plugin-store":{description:"Per-session plugin state, in the private `_lib` folder beside the routed file that reads it: one `defineSessionStore<T>(empty)` per topic, where T is the whole record for a session (the hub's last payload plus this page's own ephemeral state such as dismissed ids or the open run). The channel is `store.channel({ channel, parse, reduce })`: parse gates the wire, reduce folds one payload and reconciles the ephemeral fields; drop and reset belong to the helper. Actions are plain functions calling `store.update`, and one that sends takes a `SessionFrameSender` first. No top-level let.",includes:[`src/extensions/**/_lib/**/*Store.ts`]},"po-web-plugin-components":{description:"Panels, activity sections, overlays, and tool messages, in the private `_components` folder beside the routed file that renders them. A tool message is a `message` renderer, one component per claimed tool receiving ToolMessageRenderProps, composed from MessageItem, MessageItemHeader, MessageItemBody, MessageItemStatus, and MessageLines from @agimon-ai/po-web-components: the shell owns the frame, the outcome tone, the status badge, and the expand toggle (`expandable` when the card hides lines), the card supplies the header summary and the body. Every native tool the package registers is listed in a toolRenderers entry (web-plugin-tool-renderers). Read with `useStore(x.store, (state) => x.select(state, sessionId))`, act with `props.sendSessionFrame`, navigate with `props.openTab`, render own slots with `props.renderSlot`. Tailwind classes as complete literals; imports limited to react, the two TanStack packages, the web contract, the shared components, its own colocated `_components` and `_lib` files, src/types/**, and src/constants/**; plugins never import each other.",includes:[`src/extensions/**/_components/**/*.tsx`]},"po-web-plugin-lib":{description:"Pure view logic the colocated components share, in the private `_lib` folder beside them: formatting, matching, folding. Host-neutral, no React state, no module-level mutable state, tested from tests/ directly.",includes:[`src/extensions/**/_lib/**/*.ts`]},"po-tests":{description:`Unit, integration, and package-contract verification.`,includes:[`tests/**/*.ts`]},"po-metadata":{description:`Publishable package, documentation, and build configuration.`,includes:[`.oxlintrc.json`,`CHANGELOG.md`,`LICENSE`,`README.md`,`llms.txt`,`package.json`,`project.json`,`tsconfig.json`,`tsdown.config.ts`,`vitest.config.ts`,`vibe-lint.config.yaml`]}};export{e as patterns};
2
+ //# sourceMappingURL=patterns.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.mjs","names":["patterns"],"sources":["../../src/configs/patterns.ts"],"sourcesContent":["import type { PatternDefinition } from '@agimon-ai/vibe-lint';\n\n/**\n * Design-pattern context surfaced before a Po package file is edited. These\n * mirror the canonical source vocabulary in ../rules/architecture.ts, so a\n * package gets the guidance without restating it in its own configuration.\n */\nexport const patterns: Record<string, PatternDefinition> = {\n 'po-exports': {\n description:\n 'Flat public consumption modules exposing selected services, constants, types, schemas, and other reusable capabilities. Pure re-exports only. Host entries live directly in src/extensions; never re-export them here.',\n includes: ['src/exports/*.ts'],\n },\n 'po-constants': {\n description:\n 'Shared literal data, command metadata, and guidance. Constants import only constants and contain no implementations. Every layer, including browser code, may import constants.',\n includes: ['src/constants/**/*.ts'],\n },\n 'po-types': {\n description: 'Host-neutral contracts and option shapes. Imports only types and constants.',\n includes: ['src/types/**/*.ts'],\n },\n 'po-schemas': {\n description:\n 'Runtime TypeBox and Zod validation contracts. Transport protocols are reserved for real process/reload boundaries; same-runner package capabilities are named Cordis services.',\n includes: ['src/schemas/**/*.ts'],\n },\n 'po-services': {\n description:\n 'Package logic, including filesystem, network, process integration, and Cordis service implementations. Each service has src/services/{serviceName}/index.ts and type.ts for local contracts. Services never import extension entries. Keep dependencies explicit so behavior can be tested independently.',\n includes: ['src/services/**/*.ts'],\n },\n 'po-prompts': {\n description:\n 'Package-owned Help resources. Each direct child is a kebab-case skill directory with one SKILL.md indexed by llms.txt and shipped through the package files allowlist.',\n includes: ['src/prompts/**'],\n },\n 'po-models': {\n description:\n 'Package state and state transitions. Models import constants, models, schemas, and types; services and routed declarations consume them.',\n includes: ['src/models/**/*.ts'],\n },\n 'po-extensions': {\n description:\n 'Folder-routed files default-export exactly one typed define declaration. Their path states scope, side, surface, and identity. Use root files for shared mount state and lifecycle, services for implementation, and private colocated _lib or _components for surface-private code. Named exports never live in scanned route files. Cardinality is declared through defineRoutedContribution options rather than pseudo-surface names or catch-all files.',\n includes: ['src/extensions/**/*.ts'],\n },\n 'po-bin': {\n description:\n 'Executable composition entrypoints declared in package.json bin. Assemble services directly without importing public export wrappers or extension entries.',\n includes: ['src/bin/**/*.ts'],\n },\n 'po-web-plugin-store': {\n description:\n \"Per-session plugin state, in the private `_lib` folder beside the routed file that reads it: one `defineSessionStore<T>(empty)` per topic, where T is the whole record for a session (the hub's last payload plus this page's own ephemeral state such as dismissed ids or the open run). The channel is `store.channel({ channel, parse, reduce })`: parse gates the wire, reduce folds one payload and reconciles the ephemeral fields; drop and reset belong to the helper. Actions are plain functions calling `store.update`, and one that sends takes a `SessionFrameSender` first. No top-level let.\",\n includes: ['src/extensions/**/_lib/**/*Store.ts'],\n },\n 'po-web-plugin-components': {\n description:\n 'Panels, activity sections, overlays, and tool messages, in the private `_components` folder beside the routed file that renders them. A tool message is a `message` renderer, one component per claimed tool receiving ToolMessageRenderProps, composed from MessageItem, MessageItemHeader, MessageItemBody, MessageItemStatus, and MessageLines from @agimon-ai/po-web-components: the shell owns the frame, the outcome tone, the status badge, and the expand toggle (`expandable` when the card hides lines), the card supplies the header summary and the body. Every native tool the package registers is listed in a toolRenderers entry (web-plugin-tool-renderers). Read with `useStore(x.store, (state) => x.select(state, sessionId))`, act with `props.sendSessionFrame`, navigate with `props.openTab`, render own slots with `props.renderSlot`. Tailwind classes as complete literals; imports limited to react, the two TanStack packages, the web contract, the shared components, its own colocated `_components` and `_lib` files, src/types/**, and src/constants/**; plugins never import each other.',\n includes: ['src/extensions/**/_components/**/*.tsx'],\n },\n 'po-web-plugin-lib': {\n description:\n 'Pure view logic the colocated components share, in the private `_lib` folder beside them: formatting, matching, folding. Host-neutral, no React state, no module-level mutable state, tested from tests/ directly.',\n includes: ['src/extensions/**/_lib/**/*.ts'],\n },\n 'po-tests': {\n description: 'Unit, integration, and package-contract verification.',\n includes: ['tests/**/*.ts'],\n },\n 'po-metadata': {\n description: 'Publishable package, documentation, and build configuration.',\n includes: [\n '.oxlintrc.json',\n 'CHANGELOG.md',\n 'LICENSE',\n 'README.md',\n 'llms.txt',\n 'package.json',\n 'project.json',\n 'tsconfig.json',\n 'tsdown.config.ts',\n 'vitest.config.ts',\n 'vibe-lint.config.yaml',\n ],\n },\n};\n"],"mappings":"AAOA,MAAaA,EAA8C,CACzD,aAAc,CACZ,YACE,yNACF,SAAU,CAAC,kBAAkB,CAC/B,EACA,eAAgB,CACd,YACE,kLACF,SAAU,CAAC,uBAAuB,CACpC,EACA,WAAY,CACV,YAAa,8EACb,SAAU,CAAC,mBAAmB,CAChC,EACA,aAAc,CACZ,YACE,iLACF,SAAU,CAAC,qBAAqB,CAClC,EACA,cAAe,CACb,YACE,4SACF,SAAU,CAAC,sBAAsB,CACnC,EACA,aAAc,CACZ,YACE,yKACF,SAAU,CAAC,gBAAgB,CAC7B,EACA,YAAa,CACX,YACE,2IACF,SAAU,CAAC,oBAAoB,CACjC,EACA,gBAAiB,CACf,YACE,8bACF,SAAU,CAAC,wBAAwB,CACrC,EACA,SAAU,CACR,YACE,6JACF,SAAU,CAAC,iBAAiB,CAC9B,EACA,sBAAuB,CACrB,YACE,8kBACF,SAAU,CAAC,qCAAqC,CAClD,EACA,2BAA4B,CAC1B,YACE,8jCACF,SAAU,CAAC,wCAAwC,CACrD,EACA,oBAAqB,CACnB,YACE,qNACF,SAAU,CAAC,gCAAgC,CAC7C,EACA,WAAY,CACV,YAAa,wDACb,SAAU,CAAC,eAAe,CAC5B,EACA,cAAe,CACb,YAAa,+DACb,SAAU,CACR,iBACA,eACA,UACA,YACA,WACA,eACA,eACA,gBACA,mBACA,mBACA,uBACF,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e={"composition-layout":`error`,"routed-file-position":`error`,"routed-file-contract":`error`,"extension-side-boundary":`error`,"legacy-source-root":`error`,"plugin-composition-wiring":`error`,"po-constants":`error`,"neutral-extension-contracts":`error`,"po-folder-layout":`error`,"compatibility-wrapper-only":`error`,"po-clean-architecture-boundary":`error`,"public-export-boundary":`error`,"no-internal-public-import":`error`,"no-forwarding-module":`error`,"ports-declared-in-types":`error`,"flat-service-layout":`error`,"no-ambient-host-access":`error`,"package-layer-order":`error`,"po-layer-boundary":`error`,"clean-import-path":`error`,"service-boundary":`error`,"schema-placement":`error`,"po-package-shape":`error`,"po-prompt-shape":`error`,"po-resource-kind":`error`,"po-server-facet-shape":`error`,"pi-peer-version":`error`,"prefer-cordis-container":`error`,"cordis-context-in-pi-adapter":`error`,"cordis-feature-plugin":`error`,"cordis-host-order":`error`,"cordis-service-injection":`error`,"no-legacy-cordis-access":`error`,"no-live-global-registry":`error`,"no-manual-export-entries":`error`,"pi-extension-default-factory":`error`,"thin-pi-adapter":`error`,"no-raw-pi-events":`error`,"no-same-runner-protocol":`error`,"no-protocol-channel-literals":`error`,"dispose-external-subscriptions":`error`,"provider-owned-policy":`error`,"no-direct-tool-activation":`error`,"web-plugin-entry":`error`,"web-plugin-generated-client-wiring":`error`,"web-plugin-import-allowlist":`error`,"package-api-manifest":`error`,"web-plugin-manifest":`error`,"web-plugin-no-hand-built-api-url":`error`,"web-plugin-no-module-state":`error`,"web-plugin-protocol-layout":`error`,"web-plugin-typed-calls":`error`,"web-plugin-tool-renderers":`error`};function t(...e){return e.flatMap(e=>[`src/${e}`,`src/${e}/**`])}const n=[{name:`browser-export`,pattern:`src/exports/webClient.ts`,allowedImports:[`generated/web`,`generated/web.ts`]},{name:`constants`,pattern:`src/constants/**`,allowedImports:t(`constants`)},{name:`exports`,pattern:`src/exports/**`,allowedImports:t(`constants`,`models`,`schemas`,`services`,`types`)},{name:`types`,pattern:`src/types/**`,allowedImports:t(`constants`,`types`)},{name:`schemas`,pattern:`src/schemas/**`,allowedImports:t(`constants`,`schemas`,`types`)},{name:`models`,pattern:`src/models/**`,allowedImports:t(`constants`,`models`,`schemas`,`types`)},{name:`services`,pattern:`src/services/**`,allowedImports:t(`constants`,`models`,`schemas`,`services`,`types`)},{name:`web-plugin-routed`,pattern:`src/extensions/**/(frontend)/**`,allowedImports:[`src/types`,`src/types/**`,`src/constants`,`src/constants/**`,`src/schemas`,`src/schemas/**`,`src/extensions/**/(frontend)/**`,`generated/client`,`generated/client.ts`,`generated/client.native`,`generated/client.native.ts`]},{name:`extensions`,pattern:`src/extensions/**`,allowedImports:[...t(`constants`,`extensions`,`models`,`schemas`,`services`,`types`),`generated/mcp-apps/**`]},{name:`prompts`,pattern:`src/prompts/**`,allowedImports:[`src/prompts/**`]},{name:`bin`,pattern:`src/bin/**`,allowedImports:t(`bin`,`constants`,`models`,`schemas`,`services`,`types`)},{name:`tests`,pattern:`tests/**`,allowedImports:[`src/**`,`tests/**`,`generated/**`]},{name:`metadata`,pattern:`{.oxlintrc.json,CHANGELOG.md,LICENSE,README.md,llms.txt,package.json,project.json,tsconfig.json,tsdown.config.ts,vitest.config.ts,vibe-lint.config.yaml}`}],r=[{files:[`src/extensions/**`,`tsdown.config.ts`,`vitest.config.ts`],rules:{"no-default-export":`off`,"direct-export-only":`off`}}],i={rules:e,boundaries:n,overrides:r},a={rules:Object.fromEntries(Object.keys(e).map(e=>[e,`warn`])),boundaries:n,overrides:r};exports.migration=a,exports.recommended=i;
2
+ //# sourceMappingURL=recommended.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended.cjs","names":["rules","layer","roots","root","boundaries","overrides","recommended","migration","ruleId"],"sources":["../../src/configs/recommended.ts"],"sourcesContent":["import type { BoundaryConfig, OverrideConfig, PluginConfigPreset, Severity } from '@agimon-ai/vibe-lint';\n\nconst rules: Record<string, Severity> = {\n 'composition-layout': 'error',\n 'routed-file-position': 'error',\n 'routed-file-contract': 'error',\n 'extension-side-boundary': 'error',\n 'legacy-source-root': 'error',\n 'plugin-composition-wiring': 'error',\n 'po-constants': 'error',\n 'neutral-extension-contracts': 'error',\n 'po-folder-layout': 'error',\n 'compatibility-wrapper-only': 'error',\n 'po-clean-architecture-boundary': 'error',\n 'public-export-boundary': 'error',\n 'no-internal-public-import': 'error',\n 'no-forwarding-module': 'error',\n 'ports-declared-in-types': 'error',\n 'flat-service-layout': 'error',\n 'no-ambient-host-access': 'error',\n 'package-layer-order': 'error',\n 'po-layer-boundary': 'error',\n 'clean-import-path': 'error',\n 'service-boundary': 'error',\n 'schema-placement': 'error',\n 'po-package-shape': 'error',\n 'po-prompt-shape': 'error',\n 'po-resource-kind': 'error',\n 'po-server-facet-shape': 'error',\n 'pi-peer-version': 'error',\n 'prefer-cordis-container': 'error',\n 'cordis-context-in-pi-adapter': 'error',\n 'cordis-feature-plugin': 'error',\n 'cordis-host-order': 'error',\n 'cordis-service-injection': 'error',\n 'no-legacy-cordis-access': 'error',\n 'no-live-global-registry': 'error',\n 'no-manual-export-entries': 'error',\n 'pi-extension-default-factory': 'error',\n 'thin-pi-adapter': 'error',\n 'no-raw-pi-events': 'error',\n 'no-same-runner-protocol': 'error',\n 'no-protocol-channel-literals': 'error',\n 'dispose-external-subscriptions': 'error',\n 'provider-owned-policy': 'error',\n 'no-direct-tool-activation': 'error',\n 'web-plugin-entry': 'error',\n 'web-plugin-generated-client-wiring': 'error',\n 'web-plugin-import-allowlist': 'error',\n 'package-api-manifest': 'error',\n 'web-plugin-manifest': 'error',\n 'web-plugin-no-hand-built-api-url': 'error',\n 'web-plugin-no-module-state': 'error',\n 'web-plugin-protocol-layout': 'error',\n 'web-plugin-typed-calls': 'error',\n 'web-plugin-tool-renderers': 'error',\n};\n\n/**\n * A layer is reachable both as a directory and as files within it. Barrel\n * imports are written without the /index suffix, so `../types` resolves to the\n * directory itself and a `src/types/**` glob alone would not match it.\n */\nfunction layer(...roots: string[]): string[] {\n return roots.flatMap((root) => [`src/${root}`, `src/${root}/**`]);\n}\n\n/**\n * The canonical layer graph, kept in step with ALLOWED_ROOT_DEPENDENCIES in\n * ../rules/architecture.ts. po-layer-boundary enforces this direction from\n * TypeScript and boundary-import-allowlist enforces it from these globs, so the\n * two have to agree.\n *\n * Boundaries match first-wins and a preset's are ranked below any a package\n * declares, so a package can still replace one of these outright.\n */\nconst boundaries: BoundaryConfig[] = [\n {\n name: 'browser-export',\n pattern: 'src/exports/webClient.ts',\n allowedImports: ['generated/web', 'generated/web.ts'],\n },\n { name: 'constants', pattern: 'src/constants/**', allowedImports: layer('constants') },\n {\n name: 'exports',\n pattern: 'src/exports/**',\n allowedImports: layer('constants', 'models', 'schemas', 'services', 'types'),\n },\n { name: 'types', pattern: 'src/types/**', allowedImports: layer('constants', 'types') },\n { name: 'schemas', pattern: 'src/schemas/**', allowedImports: layer('constants', 'schemas', 'types') },\n {\n name: 'models',\n pattern: 'src/models/**',\n allowedImports: layer('constants', 'models', 'schemas', 'types'),\n },\n {\n name: 'services',\n pattern: 'src/services/**',\n allowedImports: layer('constants', 'models', 'schemas', 'services', 'types'),\n },\n {\n // The browser half of a folder-routed package, kept to the browser-only\n // policy before general composition. Matched by position rather than by a\n // literal path, so a (frontend) group anywhere in the tree is held to it.\n name: 'web-plugin-routed',\n pattern: 'src/extensions/**/(frontend)/**',\n allowedImports: [\n 'src/types',\n 'src/types/**',\n 'src/constants',\n 'src/constants/**',\n 'src/schemas',\n 'src/schemas/**',\n 'src/extensions/**/(frontend)/**',\n // The build's typed API client. Kept in step with the bare-specifier\n // list in web-plugin-import-allowlist: one rule reads the AST and this\n // one reads globs, and a browser file has to satisfy both, so a target\n // added to one and not the other is allowed and rejected at once.\n 'generated/client',\n 'generated/client.ts',\n 'generated/client.native',\n 'generated/client.native.ts',\n ],\n },\n {\n name: 'extensions',\n pattern: 'src/extensions/**',\n allowedImports: [\n ...layer('constants', 'extensions', 'models', 'schemas', 'services', 'types'),\n // Self-contained MCP App assets are build output, not generated host entrypoints.\n 'generated/mcp-apps/**',\n ],\n },\n {\n name: 'prompts',\n pattern: 'src/prompts/**',\n allowedImports: ['src/prompts/**'],\n },\n {\n name: 'bin',\n pattern: 'src/bin/**',\n allowedImports: layer('bin', 'constants', 'models', 'schemas', 'services', 'types'),\n },\n // generated/** is the routed package's host entries, which its contract and\n // lifecycle tests import to validate the native host contracts.\n { name: 'tests', pattern: 'tests/**', allowedImports: ['src/**', 'tests/**', 'generated/**'] },\n {\n name: 'metadata',\n pattern:\n '{.oxlintrc.json,CHANGELOG.md,LICENSE,README.md,llms.txt,package.json,project.json,tsconfig.json,tsdown.config.ts,vitest.config.ts,vibe-lint.config.yaml}',\n },\n];\n\n/**\n * Host loaders and build tools require default exports at their entries, and\n * so does the folder convention: a routed file under src/extensions declares\n * one contribution through its default export, the way a Next.js route does.\n */\nconst overrides: OverrideConfig[] = [\n {\n files: ['src/extensions/**', 'tsdown.config.ts', 'vitest.config.ts'],\n rules: { 'no-default-export': 'off', 'direct-export-only': 'off' },\n },\n];\n\nexport const recommended: PluginConfigPreset = { rules, boundaries, overrides };\n\nexport const migration: PluginConfigPreset = {\n rules: Object.fromEntries(Object.keys(rules).map((ruleId) => [ruleId, 'warn' as const])),\n boundaries,\n overrides,\n};\n"],"mappings":"AAEA,MAAMA,EAAkC,CACtC,qBAAsB,QACtB,uBAAwB,QACxB,uBAAwB,QACxB,0BAA2B,QAC3B,qBAAsB,QACtB,4BAA6B,QAC7B,eAAgB,QAChB,8BAA+B,QAC/B,mBAAoB,QACpB,6BAA8B,QAC9B,iCAAkC,QAClC,yBAA0B,QAC1B,4BAA6B,QAC7B,uBAAwB,QACxB,0BAA2B,QAC3B,sBAAuB,QACvB,yBAA0B,QAC1B,sBAAuB,QACvB,oBAAqB,QACrB,oBAAqB,QACrB,mBAAoB,QACpB,mBAAoB,QACpB,mBAAoB,QACpB,kBAAmB,QACnB,mBAAoB,QACpB,wBAAyB,QACzB,kBAAmB,QACnB,0BAA2B,QAC3B,+BAAgC,QAChC,wBAAyB,QACzB,oBAAqB,QACrB,2BAA4B,QAC5B,0BAA2B,QAC3B,0BAA2B,QAC3B,2BAA4B,QAC5B,+BAAgC,QAChC,kBAAmB,QACnB,mBAAoB,QACpB,0BAA2B,QAC3B,+BAAgC,QAChC,iCAAkC,QAClC,wBAAyB,QACzB,4BAA6B,QAC7B,mBAAoB,QACpB,qCAAsC,QACtC,8BAA+B,QAC/B,uBAAwB,QACxB,sBAAuB,QACvB,mCAAoC,QACpC,6BAA8B,QAC9B,6BAA8B,QAC9B,yBAA0B,QAC1B,4BAA6B,OAC/B,EAOA,SAASC,EAAM,GAAGC,EAA2B,CAC3C,OAAOA,EAAM,QAAS,GAAS,CAAC,OAAOC,IAAQ,OAAOA,EAAK,IAAI,CAAC,CAClE,CAWA,MAAMC,EAA+B,CACnC,CACE,KAAM,iBACN,QAAS,2BACT,eAAgB,CAAC,gBAAiB,kBAAkB,CACtD,EACA,CAAE,KAAM,YAAa,QAAS,mBAAoB,eAAgBH,EAAM,WAAW,CAAE,EACrF,CACE,KAAM,UACN,QAAS,iBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,WAAY,OAAO,CAC7E,EACA,CAAE,KAAM,QAAS,QAAS,eAAgB,eAAgBA,EAAM,YAAa,OAAO,CAAE,EACtF,CAAE,KAAM,UAAW,QAAS,iBAAkB,eAAgBA,EAAM,YAAa,UAAW,OAAO,CAAE,EACrG,CACE,KAAM,SACN,QAAS,gBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,OAAO,CACjE,EACA,CACE,KAAM,WACN,QAAS,kBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,WAAY,OAAO,CAC7E,EACA,CAIE,KAAM,oBACN,QAAS,kCACT,eAAgB,CACd,YACA,eACA,gBACA,mBACA,cACA,iBACA,kCAKA,mBACA,sBACA,0BACA,4BACF,CACF,EACA,CACE,KAAM,aACN,QAAS,oBACT,eAAgB,CACd,GAAGA,EAAM,YAAa,aAAc,SAAU,UAAW,WAAY,OAAO,EAE5E,uBACF,CACF,EACA,CACE,KAAM,UACN,QAAS,iBACT,eAAgB,CAAC,gBAAgB,CACnC,EACA,CACE,KAAM,MACN,QAAS,aACT,eAAgBA,EAAM,MAAO,YAAa,SAAU,UAAW,WAAY,OAAO,CACpF,EAGA,CAAE,KAAM,QAAS,QAAS,WAAY,eAAgB,CAAC,SAAU,WAAY,cAAc,CAAE,EAC7F,CACE,KAAM,WACN,QACE,0JACJ,CACF,EAOMI,EAA8B,CAClC,CACE,MAAO,CAAC,oBAAqB,mBAAoB,kBAAkB,EACnE,MAAO,CAAE,oBAAqB,MAAO,qBAAsB,KAAM,CACnE,CACF,EAEaC,EAAkC,CAAE,QAAO,aAAY,WAAU,EAEjEC,EAAgC,CAC3C,MAAO,OAAO,YAAY,OAAO,KAAKP,CAAK,CAAC,CAAC,IAAK,GAAW,CAACQ,EAAQ,MAAe,CAAC,CAAC,EACvF,aACA,WACF"}
@@ -0,0 +1,6 @@
1
+ import { PluginConfigPreset } from "@agimon-ai/vibe-lint";
2
+ //#region src/configs/recommended.d.ts
3
+ export declare const recommended: PluginConfigPreset;
4
+ export declare const migration: PluginConfigPreset;
5
+ //#endregion
6
+ //# sourceMappingURL=recommended.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended.d.mts","names":[],"sources":["../../src/configs/recommended.ts"],"mappings":";;qBAqKa,aAAa;qBAEb,WAAW"}
@@ -0,0 +1,2 @@
1
+ const e={"composition-layout":`error`,"routed-file-position":`error`,"routed-file-contract":`error`,"extension-side-boundary":`error`,"legacy-source-root":`error`,"plugin-composition-wiring":`error`,"po-constants":`error`,"neutral-extension-contracts":`error`,"po-folder-layout":`error`,"compatibility-wrapper-only":`error`,"po-clean-architecture-boundary":`error`,"public-export-boundary":`error`,"no-internal-public-import":`error`,"no-forwarding-module":`error`,"ports-declared-in-types":`error`,"flat-service-layout":`error`,"no-ambient-host-access":`error`,"package-layer-order":`error`,"po-layer-boundary":`error`,"clean-import-path":`error`,"service-boundary":`error`,"schema-placement":`error`,"po-package-shape":`error`,"po-prompt-shape":`error`,"po-resource-kind":`error`,"po-server-facet-shape":`error`,"pi-peer-version":`error`,"prefer-cordis-container":`error`,"cordis-context-in-pi-adapter":`error`,"cordis-feature-plugin":`error`,"cordis-host-order":`error`,"cordis-service-injection":`error`,"no-legacy-cordis-access":`error`,"no-live-global-registry":`error`,"no-manual-export-entries":`error`,"pi-extension-default-factory":`error`,"thin-pi-adapter":`error`,"no-raw-pi-events":`error`,"no-same-runner-protocol":`error`,"no-protocol-channel-literals":`error`,"dispose-external-subscriptions":`error`,"provider-owned-policy":`error`,"no-direct-tool-activation":`error`,"web-plugin-entry":`error`,"web-plugin-generated-client-wiring":`error`,"web-plugin-import-allowlist":`error`,"package-api-manifest":`error`,"web-plugin-manifest":`error`,"web-plugin-no-hand-built-api-url":`error`,"web-plugin-no-module-state":`error`,"web-plugin-protocol-layout":`error`,"web-plugin-typed-calls":`error`,"web-plugin-tool-renderers":`error`};function t(...e){return e.flatMap(e=>[`src/${e}`,`src/${e}/**`])}const n=[{name:`browser-export`,pattern:`src/exports/webClient.ts`,allowedImports:[`generated/web`,`generated/web.ts`]},{name:`constants`,pattern:`src/constants/**`,allowedImports:t(`constants`)},{name:`exports`,pattern:`src/exports/**`,allowedImports:t(`constants`,`models`,`schemas`,`services`,`types`)},{name:`types`,pattern:`src/types/**`,allowedImports:t(`constants`,`types`)},{name:`schemas`,pattern:`src/schemas/**`,allowedImports:t(`constants`,`schemas`,`types`)},{name:`models`,pattern:`src/models/**`,allowedImports:t(`constants`,`models`,`schemas`,`types`)},{name:`services`,pattern:`src/services/**`,allowedImports:t(`constants`,`models`,`schemas`,`services`,`types`)},{name:`web-plugin-routed`,pattern:`src/extensions/**/(frontend)/**`,allowedImports:[`src/types`,`src/types/**`,`src/constants`,`src/constants/**`,`src/schemas`,`src/schemas/**`,`src/extensions/**/(frontend)/**`,`generated/client`,`generated/client.ts`,`generated/client.native`,`generated/client.native.ts`]},{name:`extensions`,pattern:`src/extensions/**`,allowedImports:[...t(`constants`,`extensions`,`models`,`schemas`,`services`,`types`),`generated/mcp-apps/**`]},{name:`prompts`,pattern:`src/prompts/**`,allowedImports:[`src/prompts/**`]},{name:`bin`,pattern:`src/bin/**`,allowedImports:t(`bin`,`constants`,`models`,`schemas`,`services`,`types`)},{name:`tests`,pattern:`tests/**`,allowedImports:[`src/**`,`tests/**`,`generated/**`]},{name:`metadata`,pattern:`{.oxlintrc.json,CHANGELOG.md,LICENSE,README.md,llms.txt,package.json,project.json,tsconfig.json,tsdown.config.ts,vitest.config.ts,vibe-lint.config.yaml}`}],r=[{files:[`src/extensions/**`,`tsdown.config.ts`,`vitest.config.ts`],rules:{"no-default-export":`off`,"direct-export-only":`off`}}],i={rules:e,boundaries:n,overrides:r},a={rules:Object.fromEntries(Object.keys(e).map(e=>[e,`warn`])),boundaries:n,overrides:r};export{a as migration,i as recommended};
2
+ //# sourceMappingURL=recommended.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommended.mjs","names":["rules","layer","roots","root","boundaries","overrides","recommended","migration","ruleId"],"sources":["../../src/configs/recommended.ts"],"sourcesContent":["import type { BoundaryConfig, OverrideConfig, PluginConfigPreset, Severity } from '@agimon-ai/vibe-lint';\n\nconst rules: Record<string, Severity> = {\n 'composition-layout': 'error',\n 'routed-file-position': 'error',\n 'routed-file-contract': 'error',\n 'extension-side-boundary': 'error',\n 'legacy-source-root': 'error',\n 'plugin-composition-wiring': 'error',\n 'po-constants': 'error',\n 'neutral-extension-contracts': 'error',\n 'po-folder-layout': 'error',\n 'compatibility-wrapper-only': 'error',\n 'po-clean-architecture-boundary': 'error',\n 'public-export-boundary': 'error',\n 'no-internal-public-import': 'error',\n 'no-forwarding-module': 'error',\n 'ports-declared-in-types': 'error',\n 'flat-service-layout': 'error',\n 'no-ambient-host-access': 'error',\n 'package-layer-order': 'error',\n 'po-layer-boundary': 'error',\n 'clean-import-path': 'error',\n 'service-boundary': 'error',\n 'schema-placement': 'error',\n 'po-package-shape': 'error',\n 'po-prompt-shape': 'error',\n 'po-resource-kind': 'error',\n 'po-server-facet-shape': 'error',\n 'pi-peer-version': 'error',\n 'prefer-cordis-container': 'error',\n 'cordis-context-in-pi-adapter': 'error',\n 'cordis-feature-plugin': 'error',\n 'cordis-host-order': 'error',\n 'cordis-service-injection': 'error',\n 'no-legacy-cordis-access': 'error',\n 'no-live-global-registry': 'error',\n 'no-manual-export-entries': 'error',\n 'pi-extension-default-factory': 'error',\n 'thin-pi-adapter': 'error',\n 'no-raw-pi-events': 'error',\n 'no-same-runner-protocol': 'error',\n 'no-protocol-channel-literals': 'error',\n 'dispose-external-subscriptions': 'error',\n 'provider-owned-policy': 'error',\n 'no-direct-tool-activation': 'error',\n 'web-plugin-entry': 'error',\n 'web-plugin-generated-client-wiring': 'error',\n 'web-plugin-import-allowlist': 'error',\n 'package-api-manifest': 'error',\n 'web-plugin-manifest': 'error',\n 'web-plugin-no-hand-built-api-url': 'error',\n 'web-plugin-no-module-state': 'error',\n 'web-plugin-protocol-layout': 'error',\n 'web-plugin-typed-calls': 'error',\n 'web-plugin-tool-renderers': 'error',\n};\n\n/**\n * A layer is reachable both as a directory and as files within it. Barrel\n * imports are written without the /index suffix, so `../types` resolves to the\n * directory itself and a `src/types/**` glob alone would not match it.\n */\nfunction layer(...roots: string[]): string[] {\n return roots.flatMap((root) => [`src/${root}`, `src/${root}/**`]);\n}\n\n/**\n * The canonical layer graph, kept in step with ALLOWED_ROOT_DEPENDENCIES in\n * ../rules/architecture.ts. po-layer-boundary enforces this direction from\n * TypeScript and boundary-import-allowlist enforces it from these globs, so the\n * two have to agree.\n *\n * Boundaries match first-wins and a preset's are ranked below any a package\n * declares, so a package can still replace one of these outright.\n */\nconst boundaries: BoundaryConfig[] = [\n {\n name: 'browser-export',\n pattern: 'src/exports/webClient.ts',\n allowedImports: ['generated/web', 'generated/web.ts'],\n },\n { name: 'constants', pattern: 'src/constants/**', allowedImports: layer('constants') },\n {\n name: 'exports',\n pattern: 'src/exports/**',\n allowedImports: layer('constants', 'models', 'schemas', 'services', 'types'),\n },\n { name: 'types', pattern: 'src/types/**', allowedImports: layer('constants', 'types') },\n { name: 'schemas', pattern: 'src/schemas/**', allowedImports: layer('constants', 'schemas', 'types') },\n {\n name: 'models',\n pattern: 'src/models/**',\n allowedImports: layer('constants', 'models', 'schemas', 'types'),\n },\n {\n name: 'services',\n pattern: 'src/services/**',\n allowedImports: layer('constants', 'models', 'schemas', 'services', 'types'),\n },\n {\n // The browser half of a folder-routed package, kept to the browser-only\n // policy before general composition. Matched by position rather than by a\n // literal path, so a (frontend) group anywhere in the tree is held to it.\n name: 'web-plugin-routed',\n pattern: 'src/extensions/**/(frontend)/**',\n allowedImports: [\n 'src/types',\n 'src/types/**',\n 'src/constants',\n 'src/constants/**',\n 'src/schemas',\n 'src/schemas/**',\n 'src/extensions/**/(frontend)/**',\n // The build's typed API client. Kept in step with the bare-specifier\n // list in web-plugin-import-allowlist: one rule reads the AST and this\n // one reads globs, and a browser file has to satisfy both, so a target\n // added to one and not the other is allowed and rejected at once.\n 'generated/client',\n 'generated/client.ts',\n 'generated/client.native',\n 'generated/client.native.ts',\n ],\n },\n {\n name: 'extensions',\n pattern: 'src/extensions/**',\n allowedImports: [\n ...layer('constants', 'extensions', 'models', 'schemas', 'services', 'types'),\n // Self-contained MCP App assets are build output, not generated host entrypoints.\n 'generated/mcp-apps/**',\n ],\n },\n {\n name: 'prompts',\n pattern: 'src/prompts/**',\n allowedImports: ['src/prompts/**'],\n },\n {\n name: 'bin',\n pattern: 'src/bin/**',\n allowedImports: layer('bin', 'constants', 'models', 'schemas', 'services', 'types'),\n },\n // generated/** is the routed package's host entries, which its contract and\n // lifecycle tests import to validate the native host contracts.\n { name: 'tests', pattern: 'tests/**', allowedImports: ['src/**', 'tests/**', 'generated/**'] },\n {\n name: 'metadata',\n pattern:\n '{.oxlintrc.json,CHANGELOG.md,LICENSE,README.md,llms.txt,package.json,project.json,tsconfig.json,tsdown.config.ts,vitest.config.ts,vibe-lint.config.yaml}',\n },\n];\n\n/**\n * Host loaders and build tools require default exports at their entries, and\n * so does the folder convention: a routed file under src/extensions declares\n * one contribution through its default export, the way a Next.js route does.\n */\nconst overrides: OverrideConfig[] = [\n {\n files: ['src/extensions/**', 'tsdown.config.ts', 'vitest.config.ts'],\n rules: { 'no-default-export': 'off', 'direct-export-only': 'off' },\n },\n];\n\nexport const recommended: PluginConfigPreset = { rules, boundaries, overrides };\n\nexport const migration: PluginConfigPreset = {\n rules: Object.fromEntries(Object.keys(rules).map((ruleId) => [ruleId, 'warn' as const])),\n boundaries,\n overrides,\n};\n"],"mappings":"AAEA,MAAMA,EAAkC,CACtC,qBAAsB,QACtB,uBAAwB,QACxB,uBAAwB,QACxB,0BAA2B,QAC3B,qBAAsB,QACtB,4BAA6B,QAC7B,eAAgB,QAChB,8BAA+B,QAC/B,mBAAoB,QACpB,6BAA8B,QAC9B,iCAAkC,QAClC,yBAA0B,QAC1B,4BAA6B,QAC7B,uBAAwB,QACxB,0BAA2B,QAC3B,sBAAuB,QACvB,yBAA0B,QAC1B,sBAAuB,QACvB,oBAAqB,QACrB,oBAAqB,QACrB,mBAAoB,QACpB,mBAAoB,QACpB,mBAAoB,QACpB,kBAAmB,QACnB,mBAAoB,QACpB,wBAAyB,QACzB,kBAAmB,QACnB,0BAA2B,QAC3B,+BAAgC,QAChC,wBAAyB,QACzB,oBAAqB,QACrB,2BAA4B,QAC5B,0BAA2B,QAC3B,0BAA2B,QAC3B,2BAA4B,QAC5B,+BAAgC,QAChC,kBAAmB,QACnB,mBAAoB,QACpB,0BAA2B,QAC3B,+BAAgC,QAChC,iCAAkC,QAClC,wBAAyB,QACzB,4BAA6B,QAC7B,mBAAoB,QACpB,qCAAsC,QACtC,8BAA+B,QAC/B,uBAAwB,QACxB,sBAAuB,QACvB,mCAAoC,QACpC,6BAA8B,QAC9B,6BAA8B,QAC9B,yBAA0B,QAC1B,4BAA6B,OAC/B,EAOA,SAASC,EAAM,GAAGC,EAA2B,CAC3C,OAAOA,EAAM,QAAS,GAAS,CAAC,OAAOC,IAAQ,OAAOA,EAAK,IAAI,CAAC,CAClE,CAWA,MAAMC,EAA+B,CACnC,CACE,KAAM,iBACN,QAAS,2BACT,eAAgB,CAAC,gBAAiB,kBAAkB,CACtD,EACA,CAAE,KAAM,YAAa,QAAS,mBAAoB,eAAgBH,EAAM,WAAW,CAAE,EACrF,CACE,KAAM,UACN,QAAS,iBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,WAAY,OAAO,CAC7E,EACA,CAAE,KAAM,QAAS,QAAS,eAAgB,eAAgBA,EAAM,YAAa,OAAO,CAAE,EACtF,CAAE,KAAM,UAAW,QAAS,iBAAkB,eAAgBA,EAAM,YAAa,UAAW,OAAO,CAAE,EACrG,CACE,KAAM,SACN,QAAS,gBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,OAAO,CACjE,EACA,CACE,KAAM,WACN,QAAS,kBACT,eAAgBA,EAAM,YAAa,SAAU,UAAW,WAAY,OAAO,CAC7E,EACA,CAIE,KAAM,oBACN,QAAS,kCACT,eAAgB,CACd,YACA,eACA,gBACA,mBACA,cACA,iBACA,kCAKA,mBACA,sBACA,0BACA,4BACF,CACF,EACA,CACE,KAAM,aACN,QAAS,oBACT,eAAgB,CACd,GAAGA,EAAM,YAAa,aAAc,SAAU,UAAW,WAAY,OAAO,EAE5E,uBACF,CACF,EACA,CACE,KAAM,UACN,QAAS,iBACT,eAAgB,CAAC,gBAAgB,CACnC,EACA,CACE,KAAM,MACN,QAAS,aACT,eAAgBA,EAAM,MAAO,YAAa,SAAU,UAAW,WAAY,OAAO,CACpF,EAGA,CAAE,KAAM,QAAS,QAAS,WAAY,eAAgB,CAAC,SAAU,WAAY,cAAc,CAAE,EAC7F,CACE,KAAM,WACN,QACE,0JACJ,CACF,EAOMI,EAA8B,CAClC,CACE,MAAO,CAAC,oBAAqB,mBAAoB,kBAAkB,EACnE,MAAO,CAAE,oBAAqB,MAAO,qBAAsB,KAAM,CACnE,CACF,EAEaC,EAAkC,CAAE,QAAO,aAAY,WAAU,EAEjEC,EAAgC,CAC3C,MAAO,OAAO,YAAY,OAAO,KAAKP,CAAK,CAAC,CAAC,IAAK,GAAW,CAACQ,EAAQ,MAAe,CAAC,CAAC,EACvF,aACA,WACF"}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./configs/recommended.cjs"),t=require("./rules/webPlugin.cjs"),n=require("./rules/packageApi.cjs"),r=require("./rules/architecture.cjs"),i=require("./rules/conventions.cjs"),a=require("./rules/piExtensionContract.cjs"),o=require("./rules/prompts.cjs"),s=require("./rules/webPluginTools.cjs"),c=require("./rules/registry.cjs"),l=require("./plugin.cjs");exports.compatibilityWrapperOnly=r.compatibilityWrapperOnly,exports.cordisContextInPiAdapter=r.cordisContextInPiAdapter,exports.cordisFeaturePlugin=r.cordisFeaturePlugin,exports.cordisHostOrder=r.cordisHostOrder,exports.cordisServiceInjection=r.cordisServiceInjection,exports.default=l.poExtensionPlugin,exports.disposeExternalSubscriptions=i.disposeExternalSubscriptions,exports.migration=e.migration,exports.noDirectToolActivation=i.noDirectToolActivation,exports.noInternalPublicImport=r.noInternalPublicImport,exports.noLegacyCordisAccess=r.noLegacyCordisAccess,exports.noLiveGlobalRegistry=i.noLiveGlobalRegistry,exports.noManualExportEntries=i.noManualExportEntries,exports.noProtocolChannelLiterals=i.noProtocolChannelLiterals,exports.noRawPiEvents=i.noRawPiEvents,exports.noSameRunnerProtocol=i.noSameRunnerProtocol,exports.packageApiManifest=n.packageApiManifest,exports.piExtensionDefaultFactory=a.piExtensionDefaultFactory,exports.piPeerVersion=i.piPeerVersion,exports.poCleanArchitectureBoundary=r.poCleanArchitectureBoundary,exports.poExtensionPlugin=l.poExtensionPlugin,exports.poFolderLayout=r.poFolderLayout,exports.poLayerBoundary=r.poLayerBoundary,exports.poPackageShape=i.poPackageShape,exports.poPromptShape=o.poPromptShape,exports.poServerFacetShape=r.poServerFacetShape,exports.providerOwnedPolicy=i.providerOwnedPolicy,exports.publicExportBoundary=r.publicExportBoundary,exports.recommended=e.recommended,exports.rules=c.rules,exports.schemaPlacement=r.schemaPlacement,exports.serviceBoundary=r.serviceBoundary,exports.thinPiAdapter=i.thinPiAdapter,exports.webPluginEntry=t.webPluginEntry,exports.webPluginImportAllowlist=t.webPluginImportAllowlist,exports.webPluginManifest=t.webPluginManifest,exports.webPluginNoModuleState=t.webPluginNoModuleState,exports.webPluginToolRenderers=s.webPluginToolRenderers;
@@ -0,0 +1,12 @@
1
+ import { migration, recommended } from "./configs/recommended.mjs";
2
+ import { poExtensionPlugin } from "./plugin.mjs";
3
+ import { compatibilityWrapperOnly, cordisContextInPiAdapter, cordisFeaturePlugin, cordisHostOrder, cordisServiceInjection, noInternalPublicImport, noLegacyCordisAccess, poCleanArchitectureBoundary, poFolderLayout, poLayerBoundary, poServerFacetShape, publicExportBoundary, schemaPlacement, serviceBoundary } from "./rules/architecture.mjs";
4
+ import { disposeExternalSubscriptions, noDirectToolActivation, noLiveGlobalRegistry, noManualExportEntries, noProtocolChannelLiterals, noRawPiEvents, noSameRunnerProtocol, piPeerVersion, poPackageShape, providerOwnedPolicy, thinPiAdapter } from "./rules/conventions.mjs";
5
+ import { piExtensionDefaultFactory } from "./rules/piExtensionContract.mjs";
6
+ import { poPromptShape } from "./rules/prompts.mjs";
7
+ import { rules } from "./rules/registry.mjs";
8
+ import { packageApiManifest } from "./rules/packageApi.mjs";
9
+ import { webPluginEntry, webPluginImportAllowlist, webPluginManifest, webPluginNoModuleState } from "./rules/webPlugin.mjs";
10
+ import { webPluginToolRenderers } from "./rules/webPluginTools.mjs";
11
+ import "./rules/index.mjs";
12
+ export { compatibilityWrapperOnly, cordisContextInPiAdapter, cordisFeaturePlugin, cordisHostOrder, cordisServiceInjection, poExtensionPlugin as default, disposeExternalSubscriptions, migration, noDirectToolActivation, noInternalPublicImport, noLegacyCordisAccess, noLiveGlobalRegistry, noManualExportEntries, noProtocolChannelLiterals, noRawPiEvents, noSameRunnerProtocol, packageApiManifest, piExtensionDefaultFactory, piPeerVersion, poCleanArchitectureBoundary, poExtensionPlugin, poFolderLayout, poLayerBoundary, poPackageShape, poPromptShape, poServerFacetShape, providerOwnedPolicy, publicExportBoundary, recommended, rules, schemaPlacement, serviceBoundary, thinPiAdapter, webPluginEntry, webPluginImportAllowlist, webPluginManifest, webPluginNoModuleState, webPluginToolRenderers };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{migration as e,recommended as t}from"./configs/recommended.mjs";import{webPluginEntry as n,webPluginImportAllowlist as r,webPluginManifest as i,webPluginNoModuleState as a}from"./rules/webPlugin.mjs";import{packageApiManifest as o}from"./rules/packageApi.mjs";import{compatibilityWrapperOnly as s,cordisContextInPiAdapter as c,cordisFeaturePlugin as l,cordisHostOrder as u,cordisServiceInjection as d,noInternalPublicImport as f,noLegacyCordisAccess as p,poCleanArchitectureBoundary as m,poFolderLayout as h,poLayerBoundary as g,poServerFacetShape as _,publicExportBoundary as v,schemaPlacement as y,serviceBoundary as b}from"./rules/architecture.mjs";import{disposeExternalSubscriptions as x,noDirectToolActivation as S,noLiveGlobalRegistry as C,noManualExportEntries as w,noProtocolChannelLiterals as T,noRawPiEvents as E,noSameRunnerProtocol as D,piPeerVersion as O,poPackageShape as k,providerOwnedPolicy as A,thinPiAdapter as j}from"./rules/conventions.mjs";import{piExtensionDefaultFactory as M}from"./rules/piExtensionContract.mjs";import{poPromptShape as N}from"./rules/prompts.mjs";import{webPluginToolRenderers as P}from"./rules/webPluginTools.mjs";import{rules as F}from"./rules/registry.mjs";import{poExtensionPlugin as I}from"./plugin.mjs";export{s as compatibilityWrapperOnly,c as cordisContextInPiAdapter,l as cordisFeaturePlugin,u as cordisHostOrder,d as cordisServiceInjection,I as default,x as disposeExternalSubscriptions,e as migration,S as noDirectToolActivation,f as noInternalPublicImport,p as noLegacyCordisAccess,C as noLiveGlobalRegistry,w as noManualExportEntries,T as noProtocolChannelLiterals,E as noRawPiEvents,D as noSameRunnerProtocol,o as packageApiManifest,M as piExtensionDefaultFactory,O as piPeerVersion,m as poCleanArchitectureBoundary,I as poExtensionPlugin,h as poFolderLayout,g as poLayerBoundary,k as poPackageShape,N as poPromptShape,_ as poServerFacetShape,A as providerOwnedPolicy,v as publicExportBoundary,t as recommended,F as rules,y as schemaPlacement,b as serviceBoundary,j as thinPiAdapter,n as webPluginEntry,r as webPluginImportAllowlist,i as webPluginManifest,a as webPluginNoModuleState,P as webPluginToolRenderers};
@@ -0,0 +1,2 @@
1
+ const e=require("./configs/recommended.cjs"),t=require("./configs/patterns.cjs"),n={name:`po-extension`,rules:require("./rules/registry.cjs").rules,patterns:t.patterns,configs:{migration:e.migration,recommended:e.recommended}};exports.poExtensionPlugin=n;
2
+ //# sourceMappingURL=plugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs","names":["require_recommended","require_patterns","poExtensionPlugin"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { VibeLintPlugin } from '@agimon-ai/vibe-lint';\n\nimport { patterns } from './configs/patterns.js';\nimport { migration, recommended } from './configs/recommended.js';\nimport { rules } from './rules/registry.js';\n\nexport const poExtensionPlugin: VibeLintPlugin = {\n name: 'po-extension',\n rules,\n patterns,\n configs: { migration, recommended },\n};\n"],"mappings":"iFAMaE,EAAoC,CAC/C,KAAM,eACN,oCAAA,CAAA,CAAA,MACA,SAAAD,EAAA,SACA,QAAS,CAAE,UAAAD,EAAA,UAAW,YAAAA,EAAA,WAAY,CACpC"}
@@ -0,0 +1,5 @@
1
+ import { VibeLintPlugin } from "@agimon-ai/vibe-lint";
2
+ //#region src/plugin.d.ts
3
+ export declare const poExtensionPlugin: VibeLintPlugin;
4
+ //#endregion
5
+ //# sourceMappingURL=plugin.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.mts","names":[],"sources":["../src/plugin.ts"],"mappings":";;qBAMa,mBAAmB"}
@@ -0,0 +1,2 @@
1
+ import{migration as e,recommended as t}from"./configs/recommended.mjs";import{patterns as n}from"./configs/patterns.mjs";import{rules as r}from"./rules/registry.mjs";const i={name:`po-extension`,rules:r,patterns:n,configs:{migration:e,recommended:t}};export{i as poExtensionPlugin};
2
+ //# sourceMappingURL=plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.mjs","names":["poExtensionPlugin"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { VibeLintPlugin } from '@agimon-ai/vibe-lint';\n\nimport { patterns } from './configs/patterns.js';\nimport { migration, recommended } from './configs/recommended.js';\nimport { rules } from './rules/registry.js';\n\nexport const poExtensionPlugin: VibeLintPlugin = {\n name: 'po-extension',\n rules,\n patterns,\n configs: { migration, recommended },\n};\n"],"mappings":"sKAMA,MAAaA,EAAoC,CAC/C,KAAM,eACN,QACA,WACA,QAAS,CAAE,YAAW,aAAY,CACpC"}
@@ -0,0 +1,2 @@
1
+ const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./manifestEntries.cjs"),n=require("./packageApi.cjs"),r=require("./pluginWiring.cjs");let i=require("node:fs");i=e.__toESM(i,1);let a=require("node:path");a=e.__toESM(a,1);let o=require("typescript");o=e.__toESM(o,1);const s=/* @__PURE__ */ new Set([`bin`,`constants`,`exports`,`extensions`,`models`,`schemas`,`services`,`types`]),c=/* @__PURE__ */ new Set([`prompts`]),l=/* @__PURE__ */ new Set(/* @__PURE__ */ `tui.controllers.tools.adapters.commands.container.containers.providers.agents.api.common.components.config.delegation.entries.helpers.interfaces.misc.protocol.runs.shared.slash.store.tool.utils.workflow`.split(`.`)),u=/* @__PURE__ */ new Set([`.ts`,`.tsx`,`.mts`,`.cts`]),d=[`@earendil-works/pi-`,`inversify`],f=[`adapters`,`bin`,`commands`,`container`,`containers`,`providers`,`exports`,`extensions`],p={constants:/* @__PURE__ */ new Set([`constants`]),models:/* @__PURE__ */ new Set([`constants`,`models`,`schemas`,`types`]),exports:/* @__PURE__ */ new Set([`constants`,`models`,`schemas`,`services`,`types`]),extensions:/* @__PURE__ */ new Set([`extensions`,`constants`,`models`,`schemas`,`services`,`types`]),schemas:/* @__PURE__ */ new Set([`constants`,`schemas`,`types`]),services:/* @__PURE__ */ new Set([`constants`,`models`,`schemas`,`services`,`types`]),types:/* @__PURE__ */ new Set([`constants`,`types`]),bin:/* @__PURE__ */ new Set([`bin`,`constants`,`models`,`schemas`,`services`,`types`])},m=[`@agimon-ai/po`],h=[`src/builders/server/runtime.ts`],g=[`@agimon-ai/po`,`@agimon-ai/po-autostop`,`@agimon-ai/po-cache`,`@agimon-ai/po-config`,`@agimon-ai/po-domain`,`@agimon-ai/po-major-mode`,`@agimon-ai/po-notification`,`@agimon-ai/po-profile`,`@agimon-ai/po-skill`,`@agimon-ai/po-ui`],_=[`contracts`,`platform`,`integration`,`extension`,`host`],ee={"@agimon-ai/po-build":`contracts`,"@agimon-ai/po-core":`contracts`,"@agimon-ai/po-minor-mode":`platform`,"@agimon-ai/po-hashline":`contracts`,"@agimon-ai/po-telemetry":`contracts`,"@agimon-ai/po-web-security":`contracts`,"@agimon-ai/po-web-components":`contracts`,"@agimon-ai/po-config":`platform`,"@agimon-ai/po-ui":`platform`,"@agimon-ai/po-cache":`integration`,"@agimon-ai/po-mcp":`integration`,"@agimon-ai/po":`host`},te=[`@agimon-ai/po-core`,`@agimon-ai/po-hashline`,`@agimon-ai/po-telemetry`],v=[`@agimon-ai/po-`],ne=[`@agimon-ai/po-core`,`@agimon-ai/po-hashline`],re=[`@agimon-ai/foundation-`],ie=[`curatedComposition`,`dispatcherExtension`,`featureExtensionMap`,`featureFactories`,`featureMap`,`featureNames`,`featurePackages`,`featureSlots`,`fixedFeatures`,`fixedFeatureSlots`,`nativeAggregate`,`nativeOwners`,`selectedPackageExtension`],y=/(?:^|\/)extensions\/po\.(?:cjs|cts|js|mjs|mts|ts|tsx)$/i,ae=/* @__PURE__ */ new Set([`./extensions/native`,`./dist/extensions/native.mjs`]),oe=/(?:^|[/._-])(?:cordis|kernel|capabilities|native(?:[/_-][a-z0-9-]+)?)(?:$|[/._-])/i,se=/^(?:Cordis|Kernel|Native|Capabilities|CapabilityRoot)/,ce=/^\.?\/?src\//,le=/(?:^|\/)tsdown\.config\.(?:cjs|cts|js|mjs|mts|ts)$/,b=`po-capabilities`,x=`package.json`,S=`@agimon-ai/po`,ue=`${S}-`,C=`@agimon-ai/po-core`,de=/* @__PURE__ */ new Map([[`@agimon-ai/po-core`,/kernel/i]]),fe=`src/server/serverFacetLoader.ts`,pe=[fe],me=`@agimon-ai/po-core/session-context`,he=/* @__PURE__ */ new Set([`src/exports/sessionContext.ts`,`src/schemas/sessionContext.ts`]),ge=`src/systems/main/adapters/headlessSessionHost.ts`,_e=`src/services/nodeModelDependencies/index.ts`,ve=`src/builders/server/runtime.ts`,w=`src/extensions/serverPlugin.ts`,ye=/* @__PURE__ */ new Set([`PO_FS_SERVICE`,`PO_SHELL_SERVICE`,`PO_SQLITE_SERVICE`]),be=e=>e!==null&&e.startsWith(`src/extensions/`)&&e.endsWith(`.server.ts`),xe=/* @__PURE__ */ new Map([[`requirePoCordisSession`,`PO_CORDIS_SESSION_SERVICE`],[`requirePoConfigContext`,`PO_CONFIG_SERVICE`],[`requirePoConfigService`,`PO_CONFIG_SERVICE`],[`requirePoMcpProjectionService`,`PO_MCP_PROJECTION_SERVICE`],[`requirePoReadinessCoordinator`,`PO_READINESS_SERVICE`],[`requirePoTransitionCoordinator`,`PO_TRANSITION_SERVICE`],[`requirePoUiHub`,`PO_UI_HUB_SERVICE`],[`requireMinorModeCatalog`,`PO_MINOR_MODE_CATALOG_SERVICE`]]),Se=/^(?:PO_[A-Z0-9_]+_SERVICE|MINOR_MODE_CATALOG_SERVICE)$/,Ce=/^require(Po|Minor)([A-Z][A-Za-z0-9]*?)(?:Service|Context|Coordinator)?$/;function T(e,t,n){let r=e?.[t];return Array.isArray(r)&&r.every(e=>typeof e==`string`)?[...r]:[...n]}function we(e,t,n){let r=e?.[t];return typeof r==`string`?r:n}function Te(e,t,n){let r=e?.[t];if(!r||typeof r!=`object`||Array.isArray(r))return{...n};let i=Object.entries(r).filter(e=>typeof e[1]==`string`);return i.length>0?Object.fromEntries(i):{...n}}function Ee(e){return{compositionPackages:T(e,`compositionPackages`,m),compositionPaths:T(e,`compositionPaths`,h),fixedCorePackages:T(e,`fixedCorePackages`,g),infrastructurePackages:T(e,`infrastructurePackages`,te),featurePackagePrefixes:T(e,`featurePackagePrefixes`,v),foundationPackages:T(e,`foundationPackages`,ne),foundationPackagePrefixes:T(e,`foundationPackagePrefixes`,re),fixedFeatureIdentifiers:T(e,`fixedFeatureIdentifiers`,ie)}}function E(e){return!i.existsSync(e)||!u.has(a.extname(e))?null:o.default.createSourceFile(e,i.readFileSync(e,`utf8`),o.default.ScriptTarget.Latest,!0)}function D(e){return o.default.isFunctionLike(e)&&`body`in e&&e.body!==void 0}function O(e){return e===S||e?.startsWith(ue)===!0}function k(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ new Set;for(let r of e.statements){if(!o.default.isImportDeclaration(r)||!o.default.isStringLiteralLike(r.moduleSpecifier)||r.moduleSpecifier.text!==`@deepseek-ai/cordis`||r.importClause?.isTypeOnly)continue;let e=r.importClause?.namedBindings;if(e&&o.default.isNamespaceImport(e)&&n.add(e.name.text),e&&o.default.isNamedImports(e))for(let n of e.elements)n.isTypeOnly||(n.propertyName??n.name).text===`Context`&&t.add(n.name.text)}let r=e=>o.default.isCallExpression(e)&&o.default.isIdentifier(e.expression)&&e.expression.text===`require`&&e.arguments.length===1&&o.default.isStringLiteralLike(e.arguments[0])&&e.arguments[0].text===`@deepseek-ai/cordis`,i=e=>o.default.isIdentifier(e)?t.has(e.text):o.default.isPropertyAccessExpression(e)&&e.name.text===`Context`&&(o.default.isIdentifier(e.expression)&&n.has(e.expression.text)||r(e.expression)),a=e=>o.default.isIdentifier(e)&&n.has(e.text)||r(e),s=!0;for(;s;){s=!1;let r=(e,t)=>{e.has(t)||(e.add(t),s=!0)},c=e=>{if(o.default.isVariableDeclaration(e)&&e.initializer&&(o.default.isIdentifier(e.name)&&(i(e.initializer)&&r(t,e.name.text),a(e.initializer)&&r(n,e.name.text)),o.default.isObjectBindingPattern(e.name)&&a(e.initializer)))for(let n of e.name.elements){let e=n.propertyName??n.name;o.default.isIdentifier(n.name)&&(o.default.isIdentifier(e)&&e.text===`Context`||o.default.isStringLiteralLike(e)&&e.text===`Context`)&&r(t,n.name.text)}o.default.isBinaryExpression(e)&&e.operatorToken.kind===o.default.SyntaxKind.EqualsToken&&o.default.isIdentifier(e.left)&&(i(e.right)&&r(t,e.left.text),a(e.right)&&r(n,e.left.text)),o.default.forEachChild(e,c)};c(e)}let c=0,l=e=>{o.default.isNewExpression(e)&&(o.default.isIdentifier(e.expression)&&t.has(e.expression.text)&&(c+=1),o.default.isPropertyAccessExpression(e.expression)&&e.expression.name.text===`Context`&&o.default.isIdentifier(e.expression.expression)&&n.has(e.expression.expression.text)&&(c+=1)),o.default.forEachChild(e,l)};return l(e),c}function A(e){let t=/* @__PURE__ */ new Set;for(let n of e.statements){if(!o.default.isImportDeclaration(n)||!o.default.isStringLiteralLike(n.moduleSpecifier)||n.moduleSpecifier.text!==`@agimon-ai/po-core/cordisHost`)continue;let e=n.importClause?.namedBindings;if(e&&o.default.isNamedImports(e))for(let n of e.elements)(n.propertyName??n.name).text===`connectPoCordisHost`&&t.add(n.name.text)}return t}function j(e){let t=e;for(;o.default.isParenthesizedExpression(t)||o.default.isAsExpression(t)||o.default.isSatisfiesExpression(t)||o.default.isNonNullExpression(t);)t=t.expression;return t}function M(e,t,n){let r,i=n=>{o.default.isPropertyAssignment(n)&&n.name.getText(e)===t&&(r=n.initializer),o.default.isFunctionDeclaration(n)&&n.name?.text===t&&(r=n.body),o.default.isVariableDeclaration(n)&&o.default.isIdentifier(n.name)&&n.name.text===t&&n.initializer&&(r=n.initializer),o.default.forEachChild(n,i)};if(i(e),!r)return[`${t}() is missing`];let a=[],s=e=>{e!==r&&(o.default.isFunctionDeclaration(e)||o.default.isVariableDeclaration(e)&&e.initializer&&(o.default.isArrowFunction(e.initializer)||o.default.isFunctionExpression(e.initializer)))||(o.default.isCallExpression(e)&&a.push(e),o.default.forEachChild(e,s))};s(r);let c=-1,l=[];for(let r of n){let n=r.startsWith(`await `),i=n?r.slice(6):r,s=a.filter(t=>{let n=t.expression.getText(e).replaceAll(`?.`,`.`),r=t.arguments[0]&&o.default.isStringLiteralLike(t.arguments[0])?`${n}:${t.arguments[0].text}`:n;return r===i||i.startsWith(`.`)&&r.endsWith(i)}).find(t=>t.getStart(e)>c);s?(c=s.getStart(e),n&&!o.default.isAwaitExpression(s.parent)&&l.push(`${t}() must await ${i}`)):l.push(`${t}() must call ${i} in order`)}return l}function De(e,t){return t===ve?[...M(e,`closeManagedSession`,[`baseSessionManager.closeSession`,`artifacts.apis.close`,`artifacts.cleanup`]),...M(e,`runServerRuntime`,[`await sessionManager.close`,`hub.close`])]:t===_e?M(e,`createNodeModelDependencies`,[`await preloadPiExtensions`]):t===ge?[...M(e,`composeHeadlessSessionHost`,[`await models.resolveModel`]),...M(e,`activateFacets`,[`await options.requiredServerPackages`,`host.setAvailableSources`,`await host.select`,`await runtime.recover`,`await host.dispatchHook:session_start`]),...M(e,`dispose`,[`await runtime.interrupt`,`await headlessHost.dispatchHook:session_shutdown`,`await runtime.dispose`,`await headlessHost.close`])]:[...M(e,`installServerFacets`,[`root.plugin`,`await options.prepare`,`scope.plugin`,`fiber.await`,`await withTimeout`]),...M(e,`disposeInstalled`,[`.reverse`,`await fiber.dispose`]),...M(e,`dispose`,[`await disposeInstalled`,`await disposeRoot`])]}function Oe(e){let t=a.join(e,`src`);if(!i.existsSync(t))return[];let n=[],r=e=>{for(let t of i.readdirSync(e,{withFileTypes:!0})){let i=a.join(e,t.name);t.isDirectory()?r(i):t.isFile()&&u.has(a.extname(t.name))&&n.push(i)}};return r(t),n.sort()}function ke(e,n){return t.readPackageManifest(n)?.name===`@agimon-ai/po-core`&&t.projectPath(e,n)===`src/systems/main/adapters/headlessHost.ts`}function Ae(e){let t=/* @__PURE__ */ new Map,n=/* @__PURE__ */ new Map;for(let r of e.statements){if(!o.default.isImportDeclaration(r)||r.importClause?.isTypeOnly)continue;let e=r.importClause?.namedBindings;if(e&&o.default.isNamedImports(e))for(let r of e.elements){if(r.isTypeOnly)continue;let e=(r.propertyName??r.name).text,i=r.name.text,a=xe.get(e),o=Ce.exec(e),s=o?.[2]?.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).toUpperCase(),c=a??(o&&s?`PO_${o[1]===`Minor`?`MINOR_`:``}${s}_SERVICE`:void 0);c&&t.set(i,c),Se.test(e)&&n.set(i,e)}}return{requiredHelpers:t,serviceConstants:n}}function N(e,t){if(e){if(o.default.isIdentifier(e))return t.get(e.text);if(o.default.isStringLiteralLike(e)&&e.text.startsWith(`po/`))return`PO_${e.text.slice(3).replace(/[^A-Za-z0-9]+/g,`_`).toUpperCase()}_SERVICE`}}function P(e){let t=/* @__PURE__ */ new Map,n=r=>{r!==e&&o.default.isFunctionLike(r)||(o.default.isFunctionDeclaration(r)&&r.name&&r.body&&t.set(r.name.text,r),o.default.isVariableDeclaration(r)&&o.default.isIdentifier(r.name)&&r.initializer&&(o.default.isArrowFunction(r.initializer)||o.default.isFunctionExpression(r.initializer))&&t.set(r.name.text,r.initializer),o.default.forEachChild(r,n))};return n(e),t}function F(e,t){let n=[],r=e=>{if(e&&((o.default.isArrowFunction(e)||o.default.isFunctionExpression(e))&&n.push(e),o.default.isIdentifier(e))){let r=t.get(e.text);r&&n.push(r)}};e.body&&!o.default.isBlock(e.body)&&r(e.body);let i=t=>{t!==e&&o.default.isFunctionLike(t)||(o.default.isReturnStatement(t)&&r(t.expression),o.default.isYieldExpression(t)&&r(t.expression),o.default.forEachChild(t,i))};return i(e),n}function je(e){let t=F(e,P(e)),n=r=>{if(!(r!==e&&o.default.isFunctionLike(r))){if(o.default.isCallExpression(r)&&o.default.isPropertyAccessExpression(r.expression)&&r.expression.name.text===`effect`){let e=r.arguments[0];e&&(o.default.isArrowFunction(e)||o.default.isFunctionExpression(e))&&t.push(...F(e,P(e)))}o.default.forEachChild(r,n)}};return n(e),[...new Set(t)]}function Me(e){if([o.default.SyntaxKind.EqualsEqualsToken,o.default.SyntaxKind.EqualsEqualsEqualsToken,o.default.SyntaxKind.ExclamationEqualsToken,o.default.SyntaxKind.ExclamationEqualsEqualsToken].includes(e.operatorToken.kind)&&o.default.isIdentifier(e.left)&&o.default.isIdentifier(e.right))return[e.left.text,e.right.text]}function I(e,t,n,r){let i=!1,a=e=>{if(o.default.isBinaryExpression(e)){let a=Me(e),s=a!==void 0&&(a[0]===t&&a[1]===n||a[0]===n&&a[1]===t),c=[o.default.SyntaxKind.EqualsEqualsToken,o.default.SyntaxKind.EqualsEqualsEqualsToken].includes(e.operatorToken.kind);s&&c===r&&(i=!0)}i||o.default.forEachChild(e,a)};return a(e),i}function Ne(e,t,n,r){for(let i=e;i.parent&&i.parent!==t;i=i.parent){let t=i.parent;if(o.default.isIfStatement(t)){if(t.thenStatement.pos<=e.pos&&e.end<=t.thenStatement.end)return I(t.expression,n,r,!0);if(t.elseStatement&&t.elseStatement.pos<=e.pos&&e.end<=t.elseStatement.end)return I(t.expression,n,r,!1)}if(o.default.isConditionalExpression(t)){if(t.whenTrue.pos<=e.pos&&e.end<=t.whenTrue.end)return I(t.condition,n,r,!0);if(t.whenFalse.pos<=e.pos&&e.end<=t.whenFalse.end)return I(t.condition,n,r,!1)}if(o.default.isBinaryExpression(t)&&t.operatorToken.kind===o.default.SyntaxKind.AmpersandAmpersandToken&&t.right.pos<=e.pos&&e.end<=t.right.end&&I(t.left,n,r,!0))return!0}return!1}function L(e){let t=je(e),n=new Set(t),r=e.body===void 0||!o.default.isBlock(e.body)||t.length>0,i=/* @__PURE__ */ new Map,a=t=>{t!==e&&o.default.isFunctionLike(t)||n.has(t)||(o.default.isReturnStatement(t)&&t.expression&&!(o.default.isIdentifier(t.expression)&&t.expression.text===`undefined`)&&(r=!0),o.default.isCallExpression(t)&&o.default.isPropertyAccessExpression(t.expression)&&t.expression.name.text===`effect`&&(r=!0),o.default.isBinaryExpression(t)&&t.operatorToken.kind===o.default.SyntaxKind.EqualsToken&&o.default.isIdentifier(t.left)&&o.default.isIdentifier(t.right)&&t.right.text!==`undefined`&&i.set(t.left.text,t.right.text),o.default.forEachChild(t,a))};e.body&&a(e.body);let s=t.some(e=>{let t=/* @__PURE__ */ new Map,n=r=>{if(!(r!==e&&o.default.isFunctionLike(r))){if(o.default.isBinaryExpression(r)&&r.operatorToken.kind===o.default.SyntaxKind.EqualsToken&&o.default.isIdentifier(r.left)&&o.default.isIdentifier(r.right)&&r.right.text===`undefined`){let e=t.get(r.left.text)??[];e.push(r),t.set(r.left.text,e)}o.default.forEachChild(r,n)}};return n(e),[...i].some(([n,r])=>(t.get(n)??[]).some(t=>Ne(t,e,n,r)))});return{ownsLifecycle:r||s,ownsStableBinding:s}}function Pe(e){let t=/* @__PURE__ */ new Map,n=/* @__PURE__ */ new Map,r=new Set(e.map(({filePath:e})=>a.resolve(e))),i=(e,t)=>`${a.resolve(e)}::${t}`,s=(e,t)=>{if(!t.startsWith(`.`))return;let n=a.resolve(a.dirname(e),t);return[n,...[...u].map(e=>`${n}${e}`),...[...u].map(e=>a.join(n,`index${e}`))].find(e=>r.has(a.resolve(e)))},c=(e,t)=>{let r=n.get(e)??[];r.push({name:e,node:t}),n.set(e,r)};for(let{filePath:t,sourceFile:n}of e){let e=n=>{if(o.default.isFunctionDeclaration(n)&&n.name&&n.body&&(c(n.name.text,n),c(i(t,n.name.text),n),o.default.getModifiers(n)?.some(e=>e.kind===o.default.SyntaxKind.DefaultKeyword)&&c(i(t,`default`),n)),o.default.isVariableDeclaration(n)&&o.default.isIdentifier(n.name)&&n.initializer&&(o.default.isArrowFunction(j(n.initializer))||o.default.isFunctionExpression(j(n.initializer)))){let e=j(n.initializer);c(n.name.text,e),c(i(t,n.name.text),e)}if(o.default.isClassDeclaration(n)&&n.name){let e=n.members.find(o.default.isConstructorDeclaration);e&&(c(n.name.text,e),c(i(t,n.name.text),e))}o.default.forEachChild(n,e)};e(n)}for(let{filePath:r,sourceFile:a}of e){let e=/* @__PURE__ */ new Map,l=e=>i(r,e);for(let t of a.statements)if(o.default.isImportDeclaration(t)&&!t.importClause?.isTypeOnly){let n=o.default.isStringLiteralLike(t.moduleSpecifier)?s(r,t.moduleSpecifier.text):void 0,a=t.importClause;a?.name&&e.set(a.name.text,n?i(n,`default`):`default`);let c=a?.namedBindings;if(c&&o.default.isNamedImports(c))for(let t of c.elements){if(t.isTypeOnly)continue;let r=(t.propertyName??t.name).text;e.set(t.name.text,n?i(n,r):r)}}let u=t=>{o.default.isFunctionDeclaration(t)&&t.name&&e.set(t.name.text,l(t.name.text)),o.default.isVariableDeclaration(t)&&o.default.isIdentifier(t.name)&&e.set(t.name.text,l(t.name.text)),o.default.isClassDeclaration(t)&&t.name&&e.set(t.name.text,l(t.name.text)),o.default.forEachChild(t,u)};u(a),t.set(r,e);for(let e of a.statements){if(!o.default.isExportAssignment(e))continue;let t=j(e.expression);if(o.default.isArrowFunction(t)||o.default.isFunctionExpression(t))c(i(r,`default`),t);else if(o.default.isIdentifier(t))for(let e of n.get(l(t.text))??[])c(i(r,`default`),e.node)}}return{aliasesByFile:t,recordsByName:n}}function Fe(e){let{aliasesByFile:t,recordsByName:n}=Pe(e),r=/* @__PURE__ */ new Map,i=(e,t)=>{let n=e.parameters[t];if(!n||!o.default.isIdentifier(n.name))return!1;let i=r.get(e)??/* @__PURE__ */ new Set,a=i.size;return i.add(n.name.text),r.set(e,i),i.size!==a},s=e=>{let t=e.parameters[0];if(!t)return;let n=r.get(e)??/* @__PURE__ */ new Set;if(o.default.isIdentifier(t.name)&&n.add(`${t.name.text}.context`),o.default.isObjectBindingPattern(t.name))for(let e of t.name.elements)(e.propertyName?.getText()??e.name.getText())===`context`&&o.default.isIdentifier(e.name)&&n.add(e.name.text);r.set(e,n)},c=e=>{let t=[];for(let n=e.parent;n;n=n.parent)D(n)&&t.push(n);return t},l=(e,t)=>{let n=e;return!o.default.isIdentifier(n)&&!o.default.isPropertyAccessExpression(n)?!1:c(t).some(e=>r.get(e)?.has(n.getText())===!0)},u=(r,i)=>{if(o.default.isIdentifier(i)){let e=t.get(r)?.get(i.text)??i.text;return n.get(e)??[]}if(o.default.isPropertyAccessExpression(i)&&o.default.isIdentifier(i.expression)){let t=i.expression.text,n=e.find(e=>e.filePath===r),a=[],s=e=>{o.default.isVariableDeclaration(e)&&o.default.isIdentifier(e.name)&&e.name.text===t&&e.initializer&&o.default.isCallExpression(e.initializer)&&a.push(...u(r,e.initializer.expression)),o.default.forEachChild(e,s)};n&&s(n.sourceFile);let c=[];for(let e of a){let t=e=>{if(o.default.isReturnStatement(e)&&e.expression&&o.default.isObjectLiteralExpression(e.expression))for(let t of e.expression.properties)t.name?.getText()===i.name.text&&(o.default.isMethodDeclaration(t)&&c.push({name:i.name.text,node:t}),o.default.isPropertyAssignment(t)&&(o.default.isArrowFunction(t.initializer)||o.default.isFunctionExpression(t.initializer))&&c.push({name:i.name.text,node:t.initializer}));o.default.forEachChild(e,t)};t(e.node)}return c}return[]};for(let{filePath:n,sourceFile:r}of e){if(/\/src\/extensions\/(?:[^/]+\/)*\(backend\)\/extra(?:\.(?:cli|server))?\.(?:cts|mts|ts)$/.test(n.replaceAll(`\\`,`/`))){let e=e=>{if(o.default.isArrowFunction(e)||o.default.isFunctionExpression(e))i(e,0);else if(o.default.isObjectLiteralExpression(e))for(let t of e.properties)o.default.isMethodDeclaration(t)&&t.name.getText()===`apply`&&i(t,0);else for(let{node:t}of u(n,e))i(t,0)},t=n=>{if(o.default.isPropertyAssignment(n)&&n.name.getText(r)===`services`&&o.default.isArrayLiteralExpression(n.initializer))for(let t of n.initializer.elements)o.default.isExpression(t)&&e(t);o.default.forEachChild(n,t)};for(let e of r.statements){if(!o.default.isExportAssignment(e))continue;let r=j(e.expression);if(o.default.isArrowFunction(r)||o.default.isFunctionExpression(r))s(r),t(r);else for(let{node:e}of u(n,r))s(e),t(e)}}if(/\/src\/extensions\/(?:[^/]+\/)*\(backend\)\/root(?:\.(?:cli|server))?\.(?:cts|mts|ts)$/.test(n.replaceAll(`\\`,`/`))){let s=/* @__PURE__ */ new Set,c=e=>{if(!o.default.isIdentifier(e))return[];let t=[],n=r=>{o.default.isVariableDeclaration(r)&&o.default.isIdentifier(r.name)&&r.name.text===e.text&&r.initializer&&t.push(r.initializer),o.default.forEachChild(r,n)};return n(e.getSourceFile()),t},l=n=>{if(!o.default.isIdentifier(n))return[];let r=t.get(n.getSourceFile().fileName)?.get(n.text),i=r?.lastIndexOf(`::`)??-1;if(!r||i<0)return[];let s=r.slice(0,i),c=r.slice(i+2),l=e.find(e=>a.resolve(e.filePath)===s);return!l||c!=="default"?[]:l.sourceFile.statements.flatMap(e=>o.default.isExportAssignment(e)?[e.expression]:[])},d=e=>{let t=j(e);if(o.default.isArrowFunction(t)||o.default.isFunctionExpression(t))i(t,0);else if(o.default.isObjectLiteralExpression(t))for(let e of t.properties)o.default.isMethodDeclaration(e)&&e.name.getText()===`apply`&&i(e,0),o.default.isPropertyAssignment(e)&&e.name.getText()===`apply`&&(o.default.isArrowFunction(e.initializer)||o.default.isFunctionExpression(e.initializer))&&i(e.initializer,0);else for(let{node:e}of u(t.getSourceFile().fileName,t))i(e,0)},f=e=>{if(s.has(e)||!e.body)return;s.add(e);let t=o.default.isExpression(e.body)?j(e.body):e.body;if(o.default.isExpression(t)){g(t);return}let n=e=>{e!==t&&o.default.isFunctionLike(e)||(o.default.isReturnStatement(e)&&e.expression&&g(e.expression),o.default.forEachChild(e,n))};n(t)},p=e=>{for(let t of e.properties)o.default.isPropertyAssignment(t)&&t.name.getText()===`services`&&h(t.initializer),o.default.isSpreadAssignment(t)&&g(t.expression)},m=e=>{let t=j(e);if(!s.has(t)){if(s.add(t),o.default.isObjectLiteralExpression(t))p(t);else{for(let e of c(t))m(e);if(o.default.isCallExpression(t))for(let{node:e}of u(t.getSourceFile().fileName,t.expression))f(e)}}},h=e=>{let t=j(e);if(o.default.isArrayLiteralExpression(t))for(let e of t.elements)o.default.isSpreadElement(e)?h(e.expression):d(e);else if(o.default.isBinaryExpression(t)&&t.operatorToken.kind===o.default.SyntaxKind.QuestionQuestionToken)h(t.left),h(t.right);else if(o.default.isPropertyAccessExpression(t)&&t.name.text===`services`)m(t.expression);else for(let e of c(t))h(e)},g=e=>{let n=j(e);if(o.default.isArrowFunction(n)||o.default.isFunctionExpression(n))f(n);else if(o.default.isObjectLiteralExpression(n))p(n);else if(o.default.isCallExpression(n)){if((o.default.isIdentifier(n.expression)?t.get(n.getSourceFile().fileName)?.get(n.expression.text)??n.expression.text:void 0)===`defineRoot`){let e=n.arguments[0];e&&g(e);return}for(let{node:e}of u(n.getSourceFile().fileName,n.expression))f(e)}else{for(let e of c(n))g(e);for(let e of l(n))g(e);for(let{node:e}of u(n.getSourceFile().fileName,n))f(e)}},_=e=>{if(o.default.isCallExpression(e)&&o.default.isIdentifier(e.expression)&&(t.get(n)?.get(e.expression.text)??e.expression.text)===`defineRoot`){let t=e.arguments[0];t&&g(t)}o.default.forEachChild(e,_)};_(r)}let c=e=>{if(o.default.isCallExpression(e)&&o.default.isPropertyAccessExpression(e.expression)&&e.expression.name.text===`plugin`){let t=e.arguments[0];if(t&&(o.default.isArrowFunction(t)||o.default.isFunctionExpression(t)))i(t,0);else if(t&&o.default.isExpression(t))for(let{node:e}of u(n,t))i(e,0)}if(o.default.isCallExpression(e)&&o.default.isIdentifier(e.expression)&&(t.get(n)?.get(e.expression.text)??e.expression.text)===`defineServerPlugin`){let t=s,r=e=>{if(o.default.isArrowFunction(e)||o.default.isFunctionExpression(e))i(e,0);else if(o.default.isObjectLiteralExpression(e))for(let t of e.properties)o.default.isMethodDeclaration(t)&&t.name.getText()===`apply`&&i(t,0);else for(let{node:t}of u(n,e))i(t,0)},a=/* @__PURE__ */ new Set,c=e=>{if(o.default.isCallExpression(e))for(let{node:t}of u(n,e.expression))a.has(t)||(a.add(t),c(t));if(o.default.isPropertyAssignment(e)&&e.name.getText()===`services`&&o.default.isArrayLiteralExpression(e.initializer))for(let t of e.initializer.elements)o.default.isExpression(t)&&r(t);o.default.isMethodDeclaration(e)&&[`onStart`,`onStop`,`onDispose`].includes(e.name.getText())&&t(e),o.default.isPropertyAssignment(e)&&[`onStart`,`onStop`,`onDispose`].includes(e.name.getText())&&(o.default.isArrowFunction(e.initializer)||o.default.isFunctionExpression(e.initializer))&&t(e.initializer),o.default.forEachChild(e,c)},l=e=>{(o.default.isArrowFunction(e)||o.default.isFunctionExpression(e))&&t(e);for(let{node:r}of u(n,e))t(r),c(r);c(e)},d=e.arguments[0];if(d&&o.default.isObjectLiteralExpression(d))for(let e of d.properties)e.name&&[`global`,`workspace`,`session`].includes(e.name.getText())&&(o.default.isPropertyAssignment(e)&&l(e.initializer),o.default.isMethodDeclaration(e)&&(t(e),c(e)))}o.default.forEachChild(e,c)};c(r)}let d=!0;for(;d;){d=!1;for(let{filePath:t,sourceFile:n}of e){let e=n=>{if(o.default.isVariableDeclaration(n)&&o.default.isIdentifier(n.name)&&n.initializer&&l(n.initializer,n)){let e=o.default.findAncestor(n,e=>D(e));if(e){let t=r.get(e)??/* @__PURE__ */ new Set,i=t.size;t.add(n.name.text),r.set(e,t),d||=t.size!==i}}if(o.default.isCallExpression(n)){if(o.default.isPropertyAccessExpression(n.expression)&&n.expression.name.text===`inject`&&l(n.expression.expression,n)){let e=n.arguments[1];if(e&&(o.default.isArrowFunction(e)||o.default.isFunctionExpression(e)))d=i(e,0)||d;else if(e&&o.default.isExpression(e))for(let{node:n}of u(t,e))d=i(n,0)||d}if(o.default.isIdentifier(n.expression)){let e=u(t,n.expression);for(let{node:t}of e)n.arguments.forEach((e,r)=>{o.default.isExpression(e)&&l(e,n)&&(d=i(t,r)||d)})}}if(o.default.isNewExpression(n)&&o.default.isIdentifier(n.expression))for(let{node:e}of u(t,n.expression))n.arguments?.forEach((t,r)=>{l(t,n)&&(d=i(e,r)||d)});o.default.forEachChild(n,e)};e(n)}}return r}function R(e,t,n){if(!o.default.isIdentifier(e)&&!o.default.isPropertyAccessExpression(e))return!1;for(let r=t.parent;r;r=r.parent)if(D(r)&&n.get(r)?.has(e.getText()))return!0;return!1}function z(e,t,n,r){let i=o.default.findAncestor(e,o.default.isClassDeclaration),a=o.default.findAncestor(e,o.default.isConstructorDeclaration);return!(i?.name?.text===`HeadlessHost`&&i.heritageClauses?.some(e=>e.token===o.default.SyntaxKind.ExtendsKeyword&&e.types.some(e=>o.default.isIdentifier(e.expression)&&e.expression.text===`Service`)))||!a?!1:t===`provide`?n!==void 0&&o.default.isIdentifier(n)&&n.text===`context`&&r===`PO_MINOR_MODE_CATALOG_SERVICE`:e.expression.kind===o.default.SyntaxKind.SuperKeyword&&o.default.isIdentifier(e.arguments[0])&&e.arguments[0].text===`context`&&r===`PO_HEADLESS_HOST_SERVICE`}function B(e){if(o.default.isPropertyAccessExpression(e))return e.name.text;if(o.default.isElementAccessExpression(e)&&e.argumentExpression&&o.default.isStringLiteralLike(e.argumentExpression))return e.argumentExpression.text}function Ie(e){return o.default.isPropertyAccessExpression(e)||o.default.isElementAccessExpression(e)?e.expression:void 0}function Le(e){let t=o.default.findAncestor(e,o.default.isFunctionLike);if(!t)return!1;if(o.default.isFunctionDeclaration(t)&&t.name)return/^(?:read|require)(?:Po|Minor)/.test(t.name.text);let n=t.parent;return o.default.isVariableDeclaration(n)&&o.default.isIdentifier(n.name)&&/^(?:read|require)(?:Po|Minor)/.test(n.name.text)}function Re(e){let t,n;for(let r of e.properties){let e=r.name&&o.default.isIdentifier(r.name)?r.name.text:void 0;e===`inject`&&o.default.isPropertyAssignment(r)&&o.default.isArrayLiteralExpression(r.initializer)&&(t=r.initializer),e===`apply`&&(o.default.isMethodDeclaration(r)&&(n=r),o.default.isPropertyAssignment(r)&&(o.default.isArrowFunction(r.initializer)||o.default.isFunctionExpression(r.initializer))&&(n=r.initializer))}return t&&n?{inject:t,apply:n}:void 0}function V(e,t){for(let n=e.parent;n&&n!==t.callback;n=n.parent)if(o.default.isFunctionLike(n))return!1;return t.callback.pos<=e.pos&&e.end<=t.callback.end}function ze(e){let t=/* @__PURE__ */ new Set;for(let n of e.statements){if(!o.default.isImportDeclaration(n)||!o.default.isStringLiteralLike(n.moduleSpecifier)||n.moduleSpecifier.text!==`@agimon-ai/po-core/cordisHost`||n.importClause?.isTypeOnly)continue;let e=n.importClause?.namedBindings;if(e&&o.default.isNamedImports(e))for(let n of e.elements)!n.isTypeOnly&&(n.propertyName??n.name).text===`PO_CORDIS_SERVER_SERVICES`&&t.add(n.name.text)}let n=/* @__PURE__ */ new Set,r=e=>{if(o.default.isVariableDeclaration(e)&&o.default.isIdentifier(e.name)&&e.initializer){let r=j(e.initializer);o.default.isCallExpression(r)&&B(r.expression)===`get`&&r.arguments[0]&&o.default.isIdentifier(r.arguments[0])&&t.has(r.arguments[0].text)&&n.add(e.name.text)}o.default.forEachChild(e,r)};return r(e),n}function Be(e,n,r,i){let{requiredHelpers:a,serviceConstants:s}=Ae(n),c=ze(n),l=[],u=[],d=[],f=ke(e,r),p=e=>new Set(e.flatMap(e=>o.default.isExpression(e)?N(e,s)??[]:[])),m=e=>{if(o.default.isCallExpression(e)){let t=B(e.expression);if(t){let n=e.arguments[0];if(t===`inject`&&o.default.isArrayLiteralExpression(n)){let t=e.arguments[1];if(t&&(o.default.isArrowFunction(t)||o.default.isFunctionExpression(t))){let e=p(n.elements),r=L(t);l.push({callback:t,services:e,...r})}}}}if(o.default.isCallExpression(e)&&o.default.isIdentifier(e.expression)&&e.expression.text===`defineServerPlugin`){let t=e.arguments[0];if(t&&o.default.isObjectLiteralExpression(t)){let e=t.properties.find(e=>o.default.isPropertyAssignment(e)&&e.name?.getText(n)===`inject`),r=e&&o.default.isArrayLiteralExpression(e.initializer)?p(e.initializer.elements):/* @__PURE__ */ new Set,i=(e,t)=>{(o.default.isMethodDeclaration(e)||o.default.isFunctionExpression(e)||o.default.isArrowFunction(e))&&l.push({callback:e,services:t,ownsLifecycle:!0,ownsStableBinding:!1}),o.default.forEachChild(e,e=>i(e,t))};for(let e of t.properties){let t=e.name?.getText(n);(t===`global`||t===`workspace`)&&i(e,r),t===`session`&&i(e,/* @__PURE__ */ new Set([...r,`PO_HEADLESS_HOST_SERVICE`]))}}}if(o.default.isObjectLiteralExpression(e)){let t=Re(e);if(t){let e=L(t.apply);l.push({callback:t.apply,services:p(t.inject.elements),...e})}}o.default.forEachChild(e,m)};m(n);let h=p=>{if(o.default.isCallExpression(p)){if(o.default.isIdentifier(p.expression)){let t=a.get(p.expression.text);t&&d.push({service:t,filePath:e,position:p.getStart(n),directlyOwned:l.some(e=>e.services.has(t)&&V(p,e))})}let m=B(p.expression),h=Ie(p.expression);if(m&&h){let a=N(p.arguments[0],s),g=o.default.isIdentifier(h)&&c.has(h.text);m===`get`&&a&&!Le(p)&&!g&&d.push({service:a,filePath:e,position:p.getStart(n),directlyOwned:l.some(e=>e.services.has(a)&&V(p,e))}),m===`provide`&&a&&!(R(h,p,i)||f&&z(p,m,h,a))&&u.push(`${a} is provided outside a mounted plugin or injection-owned context at ${t.projectPath(e,r)??e}`)}if(p.expression.kind===o.default.SyntaxKind.SuperKeyword){let e=p.arguments[0];for(let t of p.arguments.slice(1)){let n=N(t,s);n&&!(e&&R(e,p,i)||f&&z(p,void 0,void 0,n))&&u.push(`${n} Service is constructed outside a mounted plugin or injection-owned context`)}}}o.default.forEachChild(p,h)};return h(n),{injections:l,invalidProviders:u,uses:d}}function Ve(e){let n=Oe(e).filter(n=>{let r=t.projectPath(n,e);return t.readPackageManifest(e)?.name!==`@agimon-ai/po-core`||r!==w}).flatMap(e=>{let t=E(e);return t?[{filePath:e,sourceFile:t}]:[]}),r=Fe(n),i=n.map(({filePath:t,sourceFile:n})=>Be(t,n,e,r)),a=i.flatMap(e=>e.injections),o=/* @__PURE__ */ new Map;for(let e of i.flatMap(e=>e.invalidProviders))o.set(e,/* @__PURE__ */ new Set);for(let n of i.flatMap(e=>e.uses)){if(ye.has(n.service)&&be(t.projectPath(n.filePath,e))||a.find(e=>e.ownsLifecycle&&e.services.has(n.service)&&n.directlyOwned&&e.callback.getSourceFile().fileName===n.filePath&&e.callback.getStart()<=n.position&&n.position<e.callback.getEnd())||a.some(e=>e.ownsStableBinding&&e.services.has(n.service)))continue;let r=a.some(e=>e.services.has(n.service))?`does not establish and clear an active binding for stable service wrappers`:`has no owning ctx.inject dependency`,i=o.get(`${n.service} ${r}`)??/* @__PURE__ */ new Set;i.add(t.projectPath(n.filePath,e)??n.filePath),o.set(`${n.service} ${r}`,i)}return[...o.entries()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>t.size>0?`${e}: ${[...t].sort().join(`, `)}`:e)}function He(e){let t=/* @__PURE__ */ new Set,n=/* @__PURE__ */ new Set,r=A(e);for(let r of e.statements){if(!o.default.isImportDeclaration(r)||!o.default.isStringLiteralLike(r.moduleSpecifier)||r.moduleSpecifier.text!==`@deepseek-ai/cordis`)continue;let e=r.importClause?.namedBindings;if(e&&o.default.isNamespaceImport(e)&&n.add(e.name.text),e&&o.default.isNamedImports(e))for(let n of e.elements)(n.propertyName??n.name).text===`Context`&&t.add(n.name.text)}let i=/* @__PURE__ */ new Set,a=/* @__PURE__ */ new Set,s=e=>{if(!e)return!1;if(o.default.isTypeReferenceNode(e)){let r=e.typeName;return o.default.isIdentifier(r)&&t.has(r.text)||o.default.isQualifiedName(r)&&r.right.text===`Context`&&o.default.isIdentifier(r.left)&&n.has(r.left.text)}return o.default.isParenthesizedTypeNode(e)&&s(e.type)},c=e=>{let t=e;for(;o.default.isAwaitExpression(t)||o.default.isParenthesizedExpression(t)||o.default.isAsExpression(t)||o.default.isTypeAssertionExpression(t)||o.default.isNonNullExpression(t)||o.default.isSatisfiesExpression(t);)t=t.expression;return t},l=e=>{let t=c(e);return o.default.isCallExpression(t)&&o.default.isIdentifier(t.expression)&&r.has(t.expression.text)},u=e=>{let t=c(e);return o.default.isPropertyAccessExpression(t)&&t.name.text===`root`&&o.default.isIdentifier(t.expression)&&a.has(t.expression.text)||o.default.isElementAccessExpression(t)&&o.default.isIdentifier(t.expression)&&a.has(t.expression.text)&&t.argumentExpression!==void 0&&o.default.isStringLiteralLike(t.argumentExpression)&&t.argumentExpression.text===`root`},d=e=>{let t=c(e);return o.default.isIdentifier(t)?i.has(t.text):u(t)?!0:o.default.isPropertyAccessExpression(t)&&t.name.text===`root`&&d(t.expression)},f=!0;for(;f;){f=!1;let t=(e,t)=>{e.has(t)||(e.add(t),f=!0)},n=e=>{if(o.default.isParameter(e)&&o.default.isIdentifier(e.name)&&s(e.type)&&t(i,e.name.text),o.default.isVariableDeclaration(e)&&e.initializer&&(o.default.isIdentifier(e.name)&&(l(e.initializer)&&t(a,e.name.text),(s(e.type)||d(e.initializer))&&t(i,e.name.text)),o.default.isObjectBindingPattern(e.name))){let n=c(e.initializer);if(o.default.isIdentifier(n)&&a.has(n.text))for(let n of e.name.elements){let e=n.propertyName??n.name;o.default.isIdentifier(n.name)&&(o.default.isIdentifier(e)&&e.text===`root`||o.default.isStringLiteralLike(e)&&e.text===`root`)&&t(i,n.name.text)}}if(o.default.isBinaryExpression(e)&&e.operatorToken.kind===o.default.SyntaxKind.EqualsToken&&o.default.isIdentifier(e.left)&&(l(e.right)&&t(a,e.left.text),d(e.right)&&t(i,e.left.text)),o.default.isCallExpression(e)&&o.default.isPropertyAccessExpression(e.expression)&&e.expression.name.text===`inject`&&d(e.expression.expression)){let n=e.arguments[1];n&&(o.default.isArrowFunction(n)||o.default.isFunctionExpression(n))&&n.parameters[0]&&o.default.isIdentifier(n.parameters[0].name)&&t(i,n.parameters[0].name.text)}o.default.forEachChild(e,n)};n(e)}let p=!1,m=e=>{(o.default.isPropertyAccessExpression(e)&&e.name.text===`reflect`&&d(e.expression)||o.default.isElementAccessExpression(e)&&d(e.expression)&&o.default.isStringLiteralLike(e.argumentExpression)&&e.argumentExpression.text===`reflect`)&&(p=!0),o.default.forEachChild(e,m)};return m(e),p}function Ue(e){return e.split(a.sep).filter(Boolean)}function H(e){let t=Ue(e),n=t.lastIndexOf(`src`);return n>=0?t[n+1]:void 0}function We(e){if(o.default.isImportDeclaration(e)){let t=e.importClause;return t?.isTypeOnly===!0||t?.namedBindings!==void 0&&t.name===void 0&&o.default.isNamedImports(t.namedBindings)&&t.namedBindings.elements.every(e=>e.isTypeOnly)}return o.default.isExportDeclaration(e)&&e.isTypeOnly}function Ge(e){return U(e,{runtimeOnly:!0})}function U(e,t){let n=[],r=e=>{(o.default.isImportDeclaration(e)||o.default.isExportDeclaration(e))&&e.moduleSpecifier&&o.default.isStringLiteralLike(e.moduleSpecifier)&&!(t?.runtimeOnly===!0&&We(e))&&n.push(e.moduleSpecifier.text),o.default.isCallExpression(e)&&e.expression.kind===o.default.SyntaxKind.ImportKeyword&&e.arguments.length===1&&o.default.isStringLiteralLike(e.arguments[0])&&n.push(e.arguments[0].text),o.default.forEachChild(e,r)};return r(e),n}function Ke(e){let t=[],n=e=>{o.default.isStringLiteralLike(e)&&t.push(e.text),o.default.forEachChild(e,n)};return n(e),t}function W(e,t=!1){return typeof e==`string`?[e]:Array.isArray(e)?e.flatMap(e=>W(e,t)):!e||typeof e!=`object`?[]:Object.entries(e).flatMap(([e,n])=>[...t?[e]:[],...W(n,t)])}function G(e){return Array.isArray(e)?e.flatMap(G):!e||typeof e!=`object`?[]:Object.entries(e).flatMap(([e,t])=>[e,...G(t)])}function K(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}function q(e,t){return t.some(t=>e.startsWith(t))}function J(e,t){return q(e,t.featurePackagePrefixes)&&!t.fixedCorePackages.includes(e)&&!t.infrastructurePackages.includes(e)}function qe(e,t){return t.foundationPackages.includes(e)||q(e,t.foundationPackagePrefixes)}function Je(e,t){if(t.compositionPaths.includes(e))return!0;let n=a.posix.basename(e).replace(/\.(?:cts|mts|ts|tsx)$/,``);return/(?:composition|composer|extensionassembler)/i.test(n)}function Ye(e){return e.replace(/[^a-z0-9]/gi,``).toLowerCase()}function Xe(e,t){let n=Ye(e);return new Set(t.fixedFeatureIdentifiers.map(Ye)).has(n)?!0:/^(?:fixed)?feature(?:name|package|extension)?(?:declarations?|factories|map|names?|packages?|slots?)$/.test(n)}function Ze(e,t){let n=/* @__PURE__ */ new Set,r=e=>{o.default.isIdentifier(e)&&Xe(e.text,t)&&n.add(e.text),o.default.forEachChild(e,r)};return r(e),[...n].sort()}function Y(e){return oe.test(e.replaceAll(`\\`,`/`))}function Qe(e){return o.default.isIdentifier(e)?[e.text]:e.elements.flatMap(e=>o.default.isOmittedExpression(e)?[]:Qe(e.name))}function $e(e){let t=/* @__PURE__ */ new Set;for(let n of e.statements)if(o.default.isExportDeclaration(n)&&n.exportClause&&o.default.isNamedExports(n.exportClause))for(let e of n.exportClause.elements)t.add(e.name.text);else if(o.default.isExportAssignment(n)&&o.default.isIdentifier(n.expression))t.add(n.expression.text);else if(o.default.canHaveModifiers(n)&&o.default.getModifiers(n)?.some(e=>e.kind===o.default.SyntaxKind.ExportKeyword)){if(o.default.isVariableStatement(n))for(let e of n.declarationList.declarations)for(let n of Qe(e.name))t.add(n);else(o.default.isClassDeclaration(n)||o.default.isEnumDeclaration(n)||o.default.isFunctionDeclaration(n)||o.default.isInterfaceDeclaration(n)||o.default.isModuleDeclaration(n)||o.default.isTypeAliasDeclaration(n))&&n.name&&t.add(n.name.text)}return[...t].sort()}function et(e){return/^src\/(?:index|exports\/)/.test(e)}function tt(e,t){let n=t===void 0?void 0:de.get(t),r=U(e).filter(Y);r.push(...$e(e).filter(e=>se.test(e)));let i=n===void 0?r:r.filter(e=>!n.test(e));return[...new Set(i)].sort()}function nt(e){return[...Object.keys(e.dependencies??{}),...Object.keys(e.devDependencies??{}),...Object.keys(e.optionalDependencies??{}),...Object.keys(e.peerDependencies??{})]}function rt(e){let t=a.join(e,`src`);if(!i.existsSync(t))return[];let n=[];for(let e of i.readdirSync(t,{withFileTypes:!0})){if(!e.isDirectory()){u.has(a.extname(e.name))&&n.push(`loose source file src/${e.name}`);continue}if(s.has(e.name)||c.has(e.name))continue;let r=i.readdirSync(a.join(t,e.name)).length===0;n.push(r?`empty leftover root src/${e.name}`:`noncanonical root src/${e.name}`)}return n.length>0?[`source vocabulary: ${n.sort().join(`; `)}`]:[]}function it(e,t,r){let i=[];(JSON.stringify(e)??``).includes(b)&&i.push(`po-capabilities must not be declared or referenced`);let o=W(e.exports,!0),s=o.filter(e=>y.test(e));s.length>0&&i.push(`legacy extensions/po export: ${s.join(`, `)}`);let c=o.filter(t=>Y(t)&&!ae.has(t)&&(e.name!==C||t!==`./cordis-host`));if(c.length>0&&i.push(`public native/Cordis ABI export: ${c.join(`, `)}`),e.name&&qe(e.name,r)){let t=nt(e).filter(e=>J(e,r)),n=G(e).filter(e=>Xe(e,r));t.length>0&&i.push(`foundation package declares feature dependencies: ${t.join(`, `)}`),n.length>0&&i.push(`foundation package declares fixed features: ${n.join(`, `)}`)}i.push(...at(e,t,r));let l=n.packageApiManifest.check?.(a.join(t,x),t);return l&&i.push(l),i.push(...rt(t)),i}function at(e,t,n){if(!e.name||!n.compositionPackages.includes(e.name))return[];let r=new Set(Object.keys(e.dependencies??{})),i=n.fixedCorePackages.filter(t=>t!==e.name&&!r.has(t)).filter(e=>ot(t,e)).sort();return i.length>0?[`fixed core packages missing from dependencies: ${i.join(`, `)}`]:[]}function ot(e,n){let r=n.split(`/`).pop();if(!r)return!1;let i=a.join(a.dirname(e),r,x);return t.readPackageManifest(a.dirname(i))?.name===n}function st(e,t,n,r){let i=[],a=n.name??``,o=U(t);if(O(n.name)&&(e.startsWith(`src/`)||e.startsWith(`generated/`))&&(e===`src/extensions/pi.ts`||e===`generated/pi.ts`||o.some(e=>/(?:@agimon-ai\/po-core\/(?:piExtension|runtimePiExtension)|(?:^|\/)piExtension(?:\.[cm]?ts)?)$/u.test(e)))&&i.push(`Po-owned Pi authoring entries and helpers are retired. Use native server, web, or MCP surfaces.`),(e.startsWith(`src/`)?Ke(t).filter(e=>e.includes(b)):[]).length>0&&i.push(`po-capabilities must not be referenced`),e.startsWith(`src/`)&&r.compositionPackages.includes(a)){if(Je(e,r)){let e=o.map(K).filter(e=>J(e,r));e.length>0&&i.push(`Po composition imports feature packages: ${[...new Set(e)].join(`, `)}`)}let n=Ze(t,r);n.length>0&&i.push(`Po composition contains fixed feature maps or slots: ${n.join(`, `)}`)}if(e.startsWith(`src/`)&&qe(a,r)){let e=o.map(K).filter(e=>J(e,r)),n=Ze(t,r);e.length>0&&i.push(`foundation package imports feature packages: ${[...new Set(e)].join(`, `)}`),n.length>0&&i.push(`foundation package declares fixed features: ${n.join(`, `)}`)}if(et(e)){let e=tt(t,a);e.length>0&&i.push(`public source exports native/Cordis ABI: ${e.join(`, `)}`)}if(le.test(e)){let e=Ke(t).filter(e=>ce.test(e)),n=e.filter(e=>y.test(e)),r=e.filter(Y);n.length>0&&i.push(`legacy extensions/po build entry: ${n.join(`, `)}`),r.length>0&&i.push(`public native/Cordis build entry: ${r.join(`, `)}`)}return i}function ct(e){return o.default.isCallExpression(e)&&(o.default.isPropertyAccessExpression(e.expression)&&o.default.isIdentifier(e.expression.expression)&&[`Type`,`z`].includes(e.expression.expression.text)&&e.expression.name.text!==`toJSONSchema`||o.default.isIdentifier(e.expression)&&[`Type`,`z`].includes(e.expression.text))?!0:e.getChildren().some(ct)}function X(e){return e.statements.length>0&&e.statements.every(e=>o.default.isExportDeclaration(e)&&e.moduleSpecifier!==void 0)}function Z(e,t){if(t.startsWith(`.`))return H(a.resolve(a.dirname(e),t))}function lt(e,n){let r=t.projectPath(e,n);return r===`src/extensions/server.ts`||r===`generated/server.ts`}const ut={preflight:!0,rule:`Po source modules use the canonical root vocabulary, with src/exports as the public boundary`,rationale:`One predictable folder vocabulary makes package boundaries navigable and mechanically enforceable.`,check(e){if(!i.existsSync(e))return null;let t=H(e);if(!t||t===`index.ts`||s.has(t)||c.has(t))return null;let n=E(e);return n&&X(n)&&!l.has(t)?null:`${l.has(t)?`Legacy root "${t}" is forbidden.`:`Unknown root "${t}" is not canonical.`} Move host-neutral implementation under services, models, constants, schemas, or types. Put host-specific contributions under named routes in extensions, browser code beside the routed file that renders it in src/extensions/**/(frontend)/_components (.tsx) and _lib (.ts), public re-exports under flat exports, and Help resources under prompts.`}},dt={preflight:!0,rule:`Noncanonical compatibility modules contain forwarding exports only during migration`,rationale:`Compatibility paths may remain public temporarily without becoming a second implementation architecture.`,check(e){let t=H(e);if(!t||t===`index.ts`||s.has(t)||c.has(t))return null;let n=E(e);return n&&!X(n)?`Noncanonical public paths must contain only re-exports from canonical modules during migration.`:null}},ft={preflight:!0,rule:`Pure forwarding modules may exist only under src/exports`,rationale:`A single manifest-facing boundary keeps compatibility facades from becoming a parallel internal architecture.`,check(e){let t=E(e);return!t||!X(t)||H(e)===`exports`?null:`Move this public facade under src/exports and import its canonical implementation directly everywhere else.`}},pt={preflight:!0,rule:`Implementation modules never import src/exports or their own package public subpaths`,rationale:`Internal code should depend on canonical implementations rather than cycling through compatibility facades.`,check(e,n){let r=H(e);if(!r||r===`exports`)return null;let i=E(e);if(!i)return null;let a=t.readPackageManifest(n)?.name,o=U(i).filter(t=>Z(e,t)===`exports`||a!==void 0&&(t===a||t.startsWith(`${a}/`))),s=[...new Set(o)];return s.length>0?`Implementation imports public package facades: ${s.join(`, `)}`:null}},mt={preflight:!0,rule:`Extensions compose services and models through explicit inward dependencies`,rationale:`Named routed surfaces own host concerns while a small universal dependency direction keeps policy host-neutral.`,check(e,t){let n=H(e),r=lt(e,t)?p.extensions:n?p[n]:void 0;if(!n||!r)return null;let i=E(e);if(!i||X(i))return null;let a=Ge(i).filter(t=>{let n=Z(e,t);return n!==void 0&&!r.has(n)}),o=[...new Set(a)];return o.length>0?`Layer imports forbidden dependencies: ${o.join(`, `)}`:null}},ht=/\.(?:cts|js|mjs|mts|ts|tsx)$/,gt=/\/index$/,_t={preflight:!0,rule:`Relative imports carry no file extension and no /index suffix`,rationale:`One module has one spelling. Extensions and explicit /index give the same file several import paths, so moving or barrelling it silently leaves both forms behind and deduplication, refactoring, and go-to-definition all degrade.`,check(e){let t=E(e);if(!t)return null;let n=U(t).filter(e=>{if(!e.startsWith(`.`))return!1;let t=e.replace(ht,``);return ht.test(e)||gt.test(t)}),r=[...new Set(n)];return r.length>0?`Drop the extension and any /index suffix: ${r.join(`, `)}`:null}},vt=/^I[A-Z]/,yt={preflight:!0,rule:`Services do not bootstrap plugin hosts or wire the Pi event bus`,rationale:`Services own application logic. Host capabilities go through Cordis platform services (po/fs, po/shell, po/sqlite), an injected PoPlatform, or a named Node-only module. Host registration and lifecycle ownership belong to extension helpers.`,check(e){if(H(e)!==`services`)return null;let t=E(e);if(!t||X(t))return null;let n=/* @__PURE__ */ new Set;k(t)&&n.add(`new Cordis Context`);let r=A(t),i=/* @__PURE__ */ new Set,a=e=>{o.default.isParameter(e)&&o.default.isIdentifier(e.name)&&e.type&&/\bExtensionAPI\b/.test(e.type.getText(t))&&i.add(e.name.text),o.default.forEachChild(e,a)};a(t);let s=e=>{o.default.isCallExpression(e)&&o.default.isIdentifier(e.expression)&&r.has(e.expression.text)&&n.add(`connectPoCordisHost`),o.default.isCallExpression(e)&&o.default.isPropertyAccessExpression(e.expression)&&o.default.isIdentifier(e.expression.expression)&&i.has(e.expression.expression.text)&&/^(?:on|register[A-Z])/.test(e.expression.name.text)&&n.add(`Pi.${e.expression.name.text}`),o.default.isPropertyAccessExpression(e)&&o.default.isIdentifier(e.expression)&&e.expression.text===`globalThis`&&/po|cordis|piHost/i.test(e.name.text)&&n.add(`globalThis.${e.name.text}`),o.default.forEachChild(e,s)};return s(t),n.size?`Service accesses plugin host wiring: ${[...n].sort().join(`, `)}. Declare contributions in the extension helper.`:null}},bt={preflight:!0,rule:`Services live under src/services/<serviceName> with an index.ts entry and local type.ts contracts`,rationale:`Each service owns its implementation and local contracts in one predictable folder.`,check(e,n){if(t.projectPath(e,n)!==x)return null;let r=a.join(n,`src/services`);if(!i.existsSync(r))return null;let o=i.readdirSync(r,{withFileTypes:!0}),s=o.filter(e=>e.isFile()&&u.has(a.extname(e.name)));if(s.length)return`Move flat service files into src/services/<serviceName>/index.ts: ${s.map(e=>e.name).sort().join(`, `)}.`;let c=o.filter(e=>e.isDirectory()&&!i.existsSync(a.join(r,e.name,`index.ts`)));return c.length?`Service folders require an index.ts entry: ${c.map(e=>e.name).sort().join(`, `)}.`:null}},xt={preflight:!0,rule:`Service ports live in local type.ts or shared src/types contracts`,rationale:`Local contracts belong with their service; shared contracts have a distinct public type boundary.`,check(e){let t=H(e);if(!t||t===`types`||t===`services`&&a.basename(e)===`type.ts`)return null;let n=E(e);if(!n)return null;let r=n.statements.filter(e=>(o.default.isInterfaceDeclaration(e)||o.default.isTypeAliasDeclaration(e))&&o.default.getModifiers(e)?.some(e=>e.kind===o.default.SyntaxKind.ExportKeyword)===!0&&vt.test(e.name.text)).map(e=>e.name.text);return r.length>0?`Move ${r.sort().join(`, `)} to the owning services/<serviceName>/type.ts or shared src/types and import it from there.`:null}},St={preflight:!0,rule:`A module must not exist only to forward another module`,rationale:`A file whose whole body is a re-export adds a name and a hop without adding behavior. It hides where a symbol really lives, defeats go-to-definition, and lets two import paths for the same thing drift apart. Import the canonical module directly. src/exports is the one exception, because the package manifest requires a file at each published subpath.`,check(e,n){let r=H(e);if(!r||r===`exports`||!t.projectPath(e,n))return null;let i=E(e);return!i||!X(i)?null:`This module only forwards another. Delete it and import the canonical module directly, or move it under src/exports if it is a published subpath.`}},Ct={preflight:!0,rule:`Production Cordis Contexts are constructed only by the shared Po host adapters`,rationale:`One application Context belongs to each host runner. The server facet loader owns the native host Context, publishing that host's services and recursively disposing its plugin tree. A package-local Context splits service discovery and creates a competing lifecycle.`,check(e,n){let r=t.projectPath(e,n),i=t.readPackageManifest(n);if(!r||!O(i?.name))return null;if(r===x&&i?.name===C){for(let e of pe){let t=E(a.join(n,e)),r=t?k(t):0;if(r!==1)return`The shared host must contain exactly one Cordis Context construction at ${e}; found ${r}.`}return null}if(!r.startsWith(`src/`))return null;let o=E(e);if(!o)return null;let s=k(o);return i?.name===C&&pe.includes(r)?s===1?null:`The shared host adapter must construct exactly one Cordis Context; found ${s}.`:s>0?`Do not construct a package-local Cordis root. Declare contributions with defineServerPlugin; the helper owns the host connection.`:null}},wt={preflight:!0,rule:`Native facets start after host preparation and unwind after session shutdown but before their host root`,rationale:`Host services must exist before package apply. Startup selection and required-hook admission precede run recovery, and shutdown hooks must run while their facets are still mounted. Third-party Pi provider preload still precedes model selection.`,check(e,n){let r=t.readPackageManifest(n),i=t.projectPath(e,n),o=r?.name===S?[ve]:r?.name===C?[ge,_e,fe]:[];if(!i||i!==x&&!o.includes(i))return null;let s=(i===x?o:[i]).flatMap(e=>{let t=E(a.join(n,e));return t?De(t,e):[`Native lifecycle owner is missing at ${e}`]});return s.length?`Invalid native host order: ${s.join(`; `)}.`:null}},Tt={preflight:!0,rule:`Native feature entries use defineServerPlugin and lifecycle-owned service fibers`,rationale:`The native helper owns each package lifetime, awaits service fibers, and disposes registrations on failure or unload. Features do not claim a second host lease.`,check(e,n){let i=t.readPackageManifest(n),s=t.projectPath(e,n);if(!s||!O(i?.name))return null;if(i?.name!==C||s!==w&&s!==x)return r.pluginCompositionWiring.check?.(e,n)??null;let c=E(a.join(n,w));if(!c)return`Native plugin lifecycle owner is missing at ${w}.`;let l=M(c,`defineServerPlugin`,[`createPluginLifecycle`,`context.effect`,`await lifecycle.mount`]),u=!1,d=!1,f=!1,p=0,m=(e,t)=>o.default.isCallExpression(e)&&e.expression.getText(c)===t,h=e=>{if(m(e,`createPluginLifecycle`)&&(p+=1),m(e,`lifecycle.own`)){let t=e.arguments[0];t&&o.default.isArrowFunction(t)&&m(t.body,`fiber.dispose`)&&(u=!0)}o.default.isAwaitExpression(e)&&o.default.isIdentifier(e.expression)&&e.expression.text===`fiber`&&(d=!0),o.default.isReturnStatement(e)&&e.expression&&o.default.isArrowFunction(e.expression)&&m(e.expression.body,`lifecycle.dispose`)&&(f=!0),o.default.forEachChild(e,h)};return h(c),p!==1&&l.push(`The helper must own exactly one plugin lifecycle`),(!u||!d)&&l.push(`Service fibers must be captured, owned, and awaited`),f||l.push(`The plugin must return its lifecycle disposer`),l.length?`Invalid native feature lifecycle: ${l.join(`; `)}.`:null}},Et={preflight:!0,rule:`Po packages use injected, provider-owned Cordis services rather than session-context or reflect access`,rationale:`The session-context WeakMap is bundle-local and cannot reliably join independently loaded packages. Cordis reflection also bypasses dependency tracking, so a consumer can outlive a replaced provider. The shared host connection, ctx.provide or Service, and inject preserve ownership and reload semantics.`,check(e,n){let r=t.projectPath(e,n),a=t.readPackageManifest(n);if(!r||!O(a?.name))return null;if(r===x){let e=a?.exports;return e&&typeof e==`object`&&!Array.isArray(e)&&`./session-context`in e?`Remove the legacy ./session-context export and use ./cordis-host plus injected services.`:null}if(!r.startsWith(`src/`))return null;if(he.has(r))return i.existsSync(e)?`Remove the legacy session-context module; the runner-owned host is the only Context discovery boundary.`:null;let o=E(e);if(!o)return null;let s=[];return U(o).includes(me)&&s.push(`legacy ${me} import`),He(o)&&s.push(`Cordis reflect access`),s.length>0?`Legacy Cordis access is forbidden: ${s.join(` and `)}. Publish from the owning plugin and consume with inject or ctx.get().`:null}},Dt={preflight:!0,rule:`Every required Po service is consumed under an owning Cordis inject dependency`,rationale:`A required ctx.get or requirePo* call without inject can retain a provider after it unloads or execute before it exists. An injected callback owns direct use; stable service wrappers may close over an active binding only when that callback also clears the binding during dependency disposal.`,check(e,n){let r=t.projectPath(e,n),i=t.readPackageManifest(n);if(r!==x||!O(i?.name))return null;let a=Ve(n);return a.length>0?`Invalid required Cordis service ownership: ${a.join(`; `)}.`:null}},Ot=/* @__PURE__ */ new Set([`CONFIG_DIR_NAME`,`loadSkillsFromDir`,`formatSkillsForPrompt`,`createSyntheticSourceInfo`,`getAgentDir`,`loadSkills`,`stripFrontmatter`,`buildSessionContext`,`DEFAULT_COMPACTION_SETTINGS`,`generateSummary`,`sessionEntryToContextMessages`,`serializeConversation`,`isAssistantMessageWithUsage`,`generateDiffString`,`generateUnifiedPatch`,`withFileMutationQueue`,`DEFAULT_MAX_BYTES`,`DEFAULT_MAX_LINES`,`formatSize`,`truncateHead`,`truncateTail`,`truncateLine`,`formatDimensionNote`,`resizeImage`]);function Q(e,t,n){let r=0,i=!1,a=e=>{if(o.default.isImportDeclaration(e)&&o.default.isStringLiteralLike(e.moduleSpecifier)&&e.moduleSpecifier.text===t){r+=1;let t=e.importClause,a=t?.namedBindings;if(t?.isTypeOnly)return;(t?.name||!a||!o.default.isNamedImports(a)||a.elements.some(e=>!e.isTypeOnly&&!n.has((e.propertyName??e.name).text)))&&(i=!0)}o.default.isCallExpression(e)&&e.arguments.some(e=>o.default.isStringLiteralLike(e)&&e.text===t)&&(i=!0),o.default.forEachChild(e,a)};return a(e),r>0&&!i}const kt={"src/services/durableNavigation/index.ts":{"@earendil-works/pi-durable":[`defineDoc`]},"src/services/requestReceipts/index.ts":{"@earendil-works/pi-durable":[`defineDoc`]},"src/services/sqliteSessionStorage/index.ts":{"@earendil-works/pi-durable":[`createSession`,`defineDoc`],"@earendil-works/pi-durable/storage/sqlite":[`SqliteStorage`],"@earendil-works/pi-durable/storage/sqlite/node":[`NodeSqliteDatabase`,`openNodeSqliteStorage`]},"src/services/sqliteTranscriptReader/index.ts":{"@earendil-works/pi-durable":[`createSession`]},"src/services/sqliteSessionHistory/index.ts":{"@earendil-works/pi-durable":[`createSession`]},"src/services/layerPackageInstaller/index.ts":{"@earendil-works/pi-coding-agent":[`DefaultPackageManager`,`SettingsManager`]}};function At(e,n,r,i){if(n===`@earendil-works/pi-coding-agent`&&Q(e,n,Ot))return!0;if(t.readPackageManifest(i)?.name!==`@agimon-ai/po-core`)return!1;let a=kt[t.projectPath(r,i)??``]?.[n];return a!==void 0&&Q(e,n,new Set(a))}const jt={preflight:!0,rule:`Services do not depend on host entries, controllers, tools, or obsolete adapter and container layers`,rationale:`Services own package logic and may use Node APIs, while host registration and request handling stay in outer layers.`,check(e,t){if(H(e)!==`services`)return null;let n=E(e);if(!n||X(n))return null;let r=Ge(n).filter(r=>{if(d.some(e=>r.startsWith(e))&&!At(n,r,e,t))return!0;let i=Z(e,r);return i?f.includes(i):!1});return r.length>0?`Service imports forbidden dependencies: ${r.join(`, `)}`:null}},Mt={preflight:!0,rule:`Runtime TypeBox and Zod schema construction lives under src/schemas`,rationale:`Central runtime schemas keep validation contracts discoverable while services consume schema-derived types.`,check(e){let t=H(e);if(!t||t===`schemas`)return null;let n=E(e);return n&&ct(n)?`Move runtime TypeBox or Zod schema construction under src/schemas and import the derived contract.`:null}};function Nt(e){return{order:T(e,`packageLayerOrder`,_),layers:Te(e,`packageLayers`,ee),fallback:we(e,`packageLayerFallback`,`extension`),featurePackagePrefixes:T(e,`featurePackagePrefixes`,v)}}function $(e,t){let n=t.layers[e]??(q(e,t.featurePackagePrefixes)?t.fallback:void 0);if(!n)return;let r=t.order.indexOf(n);return r>=0?r:void 0}function Pt(e,t,n){if(t===x)return nt(n);if(!t.startsWith(`src/`))return[];let r=E(e);return r?U(r).map(K):[]}const Ft={preflight:!0,rule:`A package depends on its own tier or a lower one, never on a higher one`,rationale:'The distribution is a layered graph: contracts, then platform, then integration, then extensions, then the host. An edge that points up closes a cycle. nx orders builds by `dependsOn: ["^build"]` over that same graph, so a cycle is not a slow build, it is a build with no valid order, and it surfaces as an error in an unrelated package long after the import was written. The tiers are dependency depth, not activation role: a package can be fixed host core and still sit above the platform it needs.',check(e,n,r){let i=t.readPackageManifest(n),a=i?.name,o=t.projectPath(e,n);if(!i||!a||!o)return null;let s=Nt(r?.options),c=$(a,s);if(c===void 0)return null;let l=[...new Set(Pt(e,o,i))].filter(e=>{if(e===a)return!1;let t=$(e,s);return t!==void 0&&t>c});if(l.length===0)return null;let u=s.order.length-1,d=l.filter(e=>$(e,s)===u),f=d.length>0?` Depending on ${d.sort().join(`, `)} makes the nx project graph cyclic.`:``;return`${a} is a ${s.order[c]} package and depends on a higher tier: ${l.sort().join(`, `)}.${f}`}},It={preflight:!0,rule:`Po composition stays layer-driven and publishes only native extension surfaces`,rationale:`Keeping feature activation in modes.yaml and package manifests prevents fixed feature inventories, compatibility ABIs, and host-owned lifecycle coupling from returning.`,check(e,n,r){let i=t.projectPath(e,n);if(!i)return null;let a=Ee(r?.options),o=t.readPackageManifest(n);if(!o)return null;let s=[];(n.includes(b)||i.includes(b))&&s.push(`po-capabilities package paths are forbidden`),y.test(i)&&s.push(`legacy extensions/po file: ${i}`),i===x&&s.push(...it(o,n,a));let c=E(e);c&&s.push(...st(i,c,o,a));let l=[...new Set(s)];return l.length>0?`Clean architecture boundary violations: ${l.join(`; `)}`:null}},Lt=/* @__PURE__ */ new Set([`src/extensions/server.ts`,`generated/server.ts`]),Rt={preflight:!0,rule:`Server facets use defineServerPlugin with explicit global, workspace, and session contributions`,rationale:`The shared helper owns host injection, scope selection, rollback, and disposal. Package apply functions duplicate this lifecycle and allow contributions to leak between scopes.`,check(e,n){let r=t.projectPath(e,n);if(!i.existsSync(e))return null;if(r===`src/adapters/headless/facet.ts`)return`Remove the separate headless facet; declare contributions in defineServerPlugin.`;if(r===null||!Lt.has(r)&&r!==`src/adapters/server/facet.ts`)return null;let a=E(e);if(!a)return null;let s=[],c=e=>{if(o.default.isCallExpression(e)&&o.default.isPropertyAccessExpression(e.expression)&&e.expression.name.text===`apply`&&s.push(`Do not nest facet.apply lifecycles; declare contributions and onStart/onStop hooks.`),o.default.isVariableDeclaration(e)&&(e.name.getText(a).endsWith(`ServerFacet`)||e.type?.getText(a)===`PoServerFacet`)){let t=e.initializer;(!t||!o.default.isCallExpression(t)||t.expression.getText(a)!==`defineServerPlugin`)&&s.push(`${e.name.getText(a)} must use defineServerPlugin`)}if(o.default.isCallExpression(e)&&e.expression.getText(a)===`defineServerPlugin`){let t=e.arguments[0];if(!t||!o.default.isObjectLiteralExpression(t))s.push(`defineServerPlugin requires an explicit scope object`);else for(let e of t.properties){let t=e.name?.getText(a).replace(/['"]/gu,``);(!t||![`name`,`inject`,`providerOverrides`,`global`,`workspace`,`session`].includes(t))&&s.push(`Only name, inject, providerOverrides, global, workspace, and session belong at the plugin root; remove legacy apply and spread properties`)}}o.default.forEachChild(e,c)};return c(a),s.length?[...new Set(s)].join(`; `):null}};exports.cleanImportPath=_t,exports.compatibilityWrapperOnly=dt,exports.cordisContextInPiAdapter=Ct,exports.cordisFeaturePlugin=Tt,exports.cordisHostOrder=wt,exports.cordisServiceInjection=Dt,exports.flatServiceLayout=bt,exports.isPureReExportModule=X,exports.noAmbientHostAccess=yt,exports.noForwardingModule=St,exports.noInternalPublicImport=pt,exports.noLegacyCordisAccess=Et,exports.packageLayerOrder=Ft,exports.poCleanArchitectureBoundary=It,exports.poFolderLayout=ut,exports.poLayerBoundary=mt,exports.poServerFacetShape=Rt,exports.portsDeclaredInTypes=xt,exports.publicExportBoundary=ft,exports.schemaPlacement=Mt,exports.serviceBoundary=jt;
2
+ //# sourceMappingURL=architecture.cjs.map