@agimon-ai/po 0.0.0-alpha.43 → 0.0.0-alpha.44
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.
- package/README.md +27 -15
- package/dist/builders/cli/extensionAssembler/index.cjs +3 -1
- package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.mjs +3 -1
- package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
- package/dist/catalog/index.json +64 -62
- package/dist/src/builders/server/containedSessions.cjs +3 -0
- package/dist/src/builders/server/containedSessions.cjs.map +1 -1
- package/dist/src/builders/server/containedSessions.mjs +3 -0
- package/dist/src/builders/server/containedSessions.mjs.map +1 -1
- package/dist/src/builders/server/idleRestart.cjs +38 -6
- package/dist/src/builders/server/idleRestart.cjs.map +1 -1
- package/dist/src/builders/server/idleRestart.mjs +36 -7
- package/dist/src/builders/server/idleRestart.mjs.map +1 -1
- package/dist/src/builders/server/nativePush.cjs +14 -20
- package/dist/src/builders/server/nativePush.cjs.map +1 -1
- package/dist/src/builders/server/nativePush.mjs +15 -21
- package/dist/src/builders/server/nativePush.mjs.map +1 -1
- package/dist/src/builders/server/runtime.cjs +40 -15
- package/dist/src/builders/server/runtime.cjs.map +1 -1
- package/dist/src/builders/server/runtime.mjs +41 -16
- package/dist/src/builders/server/runtime.mjs.map +1 -1
- package/dist/src/builders/server/sandboxRouter.cjs +6 -0
- package/dist/src/builders/server/sandboxRouter.cjs.map +1 -1
- package/dist/src/builders/server/sandboxRouter.mjs +6 -0
- package/dist/src/builders/server/sandboxRouter.mjs.map +1 -1
- package/dist/src/cli/server/supervise.cjs +4 -1
- package/dist/src/cli/server/supervise.cjs.map +1 -1
- package/dist/src/cli/server/supervise.mjs +4 -1
- package/dist/src/cli/server/supervise.mjs.map +1 -1
- package/docs/server/index.md +2 -0
- package/package.json +21 -20
package/README.md
CHANGED
|
@@ -121,9 +121,8 @@ and keep their model tools and skills out of context until turned on. Po ships s
|
|
|
121
121
|
|
|
122
122
|
- **Help mode:** expose package-owned guidance only while you need it.
|
|
123
123
|
- **Plan mode:** remove Pi's file-editing tools while you agree on an approach.
|
|
124
|
-
- **
|
|
124
|
+
- **Calendar layer:** schedule durable prompts, workflows and plugin actions while the server is up.
|
|
125
125
|
- **Goal mode:** keep one objective in view until it is done or dismissed.
|
|
126
|
-
- **Workflow mode:** run jobs with dependencies, timeouts, and artifacts.
|
|
127
126
|
- **Voice mode:** replace typing with local speech.
|
|
128
127
|
|
|
129
128
|
### Domains
|
|
@@ -205,7 +204,7 @@ house, and the primary agent can speak its own opening, milestone, and final upd
|
|
|
205
204
|
|
|
206
205
|
### Autopilot
|
|
207
206
|
|
|
208
|
-
Copilot helps while you are present.
|
|
207
|
+
Copilot helps while you are present. Calendar and Workflow keep work moving when you are not.
|
|
209
208
|
Together they can dispatch structured jobs from one live session.
|
|
210
209
|
|
|
211
210
|
#### Workflows
|
|
@@ -232,8 +231,8 @@ automations/workflows/
|
|
|
232
231
|
Each plugin has both `.codex-plugin/plugin.json` and `.claude-plugin/plugin.json`, while its
|
|
233
232
|
`skills/` and `agents/` content is shared. `.po/domains.yaml` exposes the `development`,
|
|
234
233
|
`testing`, and `blog` domains plus the `engineering` alias. `.po/modes.yaml` mirrors the
|
|
235
|
-
standalone package set with workspace-local paths, keeps its canonical modes, and adds
|
|
236
|
-
`examples` base mode for the tracked workflows. Inspect the exact session before launch:
|
|
234
|
+
standalone package set with workspace-local paths, keeps its canonical modes, and adds an
|
|
235
|
+
`examples` base mode with the `workflow` layer for the tracked workflows. Inspect the exact session before launch:
|
|
237
236
|
|
|
238
237
|
```bash
|
|
239
238
|
po --major-mode examples --domains engineering --explain
|
|
@@ -270,10 +269,10 @@ not create branches, commits, or pushes. Blog runs leave review-ready Markdown,
|
|
|
270
269
|
publication checklist in the workflow run directory without writing into a site or calling a CMS.
|
|
271
270
|
These examples live in the source repository and are not part of the published npm tarball.
|
|
272
271
|
|
|
273
|
-
####
|
|
272
|
+
#### Calendar
|
|
274
273
|
|
|
275
274
|
Workflow definitions are exposed like skills, so the agent can choose one for the job. A
|
|
276
|
-
|
|
275
|
+
Calendar event can send a subagent to fetch the next task, then dispatch the workflow that matches
|
|
277
276
|
it. One session becomes the dispatcher instead of the place every job has to fit.
|
|
278
277
|
|
|
279
278
|
## Features
|
|
@@ -406,9 +405,13 @@ for approval. It does not sandbox Bash, external tools, or the operating system.
|
|
|
406
405
|
planning tools and web review surface; terminal planning menus are no longer available.
|
|
407
406
|
Turn it on when the approach should be settled before the files move.
|
|
408
407
|
|
|
409
|
-
#### Calendar
|
|
408
|
+
#### Calendar layer
|
|
410
409
|
|
|
411
|
-
[`@agimon-ai/po-calendar`][pkg-po-calendar] schedules durable
|
|
410
|
+
[`@agimon-ai/po-calendar`][pkg-po-calendar] schedules durable prompts, workflows and plugin actions.
|
|
411
|
+
Keep the calendar layer in the home default major mode for the scheduler. Workflow success means launched,
|
|
412
|
+
not finished. Plugin-managed events cannot be edited, but pause, resume, run now and cancel remain available.
|
|
413
|
+
Busy runs and downtime are skipped, never replayed. Back up before upgrading: older Calendar versions
|
|
414
|
+
cannot read events saved with workflow, action or assignment fields.
|
|
412
415
|
|
|
413
416
|
#### Goal mode
|
|
414
417
|
|
|
@@ -416,7 +419,7 @@ Turn it on when the approach should be settled before the files move.
|
|
|
416
419
|
you end it. Native goal tools manage the active objective and repository history. Finished goals
|
|
417
420
|
stop contributing active instructions and tools but remain in history when you want to restart one.
|
|
418
421
|
|
|
419
|
-
#### Workflow
|
|
422
|
+
#### Workflow layer
|
|
420
423
|
|
|
421
424
|
[`@agimon-ai/po-workflow`][pkg-po-workflow] runs GitHub Actions-style job graphs with
|
|
422
425
|
dependencies, timeouts, artifacts, and a separate Po session for each step. Native workflow tools
|
|
@@ -496,13 +499,17 @@ default:
|
|
|
496
499
|
- '@agimon-ai/po-edit'
|
|
497
500
|
- '@agimon-ai/po-file-edit'
|
|
498
501
|
- '@agimon-ai/po-autocompact'
|
|
499
|
-
- '@agimon-ai/po-calendar'
|
|
500
502
|
- '@agimon-ai/po-plan'
|
|
501
|
-
- '@agimon-ai/po-workflow'
|
|
502
503
|
- '@agimon-ai/po-log'
|
|
503
504
|
- '@agimon-ai/po-mcp'
|
|
504
505
|
|
|
505
506
|
layers:
|
|
507
|
+
calendar:
|
|
508
|
+
packages:
|
|
509
|
+
- '@agimon-ai/po-calendar'
|
|
510
|
+
workflow:
|
|
511
|
+
packages:
|
|
512
|
+
- '@agimon-ai/po-workflow'
|
|
506
513
|
team:
|
|
507
514
|
packages:
|
|
508
515
|
- name: '@agimon-ai/po-team'
|
|
@@ -518,10 +525,10 @@ defaultMajorMode: copilot
|
|
|
518
525
|
majorMode:
|
|
519
526
|
minimal:
|
|
520
527
|
description: Lean sessions with delegation and little else.
|
|
521
|
-
layers: [team]
|
|
528
|
+
layers: [team, workflow, calendar]
|
|
522
529
|
copilot:
|
|
523
530
|
description: General coding with delegation and review tools.
|
|
524
|
-
layers: [team, review]
|
|
531
|
+
layers: [team, review, workflow, calendar]
|
|
525
532
|
```
|
|
526
533
|
|
|
527
534
|
Order matters: Po assembles `default.packages` first, then the selected layers and their
|
|
@@ -531,6 +538,11 @@ composition, not a mystery bag of shared configuration. Home and repository `lay
|
|
|
531
538
|
sources declare `default`, the repository block replaces the personal block as one whole package
|
|
532
539
|
list.
|
|
533
540
|
|
|
541
|
+
Workflow is selected through the `workflow` layer, not a minor-mode switch. New seeds
|
|
542
|
+
include it in `minimal`, `copilot` and `examples`; remove the layer from a mode to omit it.
|
|
543
|
+
Existing `default.packages` entries still work and deduplicate with the layer. No config
|
|
544
|
+
migration runs, and persisted `minorModes: [workflow]` has no effect.
|
|
545
|
+
|
|
534
546
|
Configurations created before the hashline tools were split may contain only `po-edit`.
|
|
535
547
|
Replace that entry with the ordered `po-read`, `po-grep`, and `po-edit` trio. Init
|
|
536
548
|
preserves existing configuration unless it is run with `--force`.
|
|
@@ -645,7 +657,7 @@ process environment and operating-system privileges; their logs may contain comm
|
|
|
645
657
|
secrets. MCP credentials may live in the system keyring or private configuration files.
|
|
646
658
|
|
|
647
659
|
Voice can keep PCM capture and transcription local when local engines are selected, but transcript
|
|
648
|
-
text and model requests follow the configured providers.
|
|
660
|
+
text and model requests follow the configured providers. Calendar, Workflow, Plan, Autocompact, Team,
|
|
649
661
|
and autonomous Voice can make additional model calls. Telemetry is disabled or redirected through
|
|
650
662
|
its owning package's controls; values supplied by callers are not automatically scrubbed.
|
|
651
663
|
|
|
@@ -15,6 +15,7 @@ const DEFAULT_SELECTION_LAYER = "default";
|
|
|
15
15
|
const DEFAULT_SELECTION_LAYER_INDEX = -1;
|
|
16
16
|
const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
|
|
17
17
|
"@agimon-ai/po",
|
|
18
|
+
"@agimon-ai/po-approval",
|
|
18
19
|
"@agimon-ai/po-artifact",
|
|
19
20
|
"@agimon-ai/po-autostop",
|
|
20
21
|
"@agimon-ai/po-cache",
|
|
@@ -40,7 +41,8 @@ const CORE_PACKAGE_ENTRIES = [
|
|
|
40
41
|
"@agimon-ai/po-major-mode/extensions/server",
|
|
41
42
|
"@agimon-ai/po-skill/extensions/server",
|
|
42
43
|
"@agimon-ai/po-domain/extensions/server",
|
|
43
|
-
"@agimon-ai/po-artifact/extensions/server"
|
|
44
|
+
"@agimon-ai/po-artifact/extensions/server",
|
|
45
|
+
"@agimon-ai/po-approval/extensions/server"
|
|
44
46
|
];
|
|
45
47
|
const CACHE_PACKAGE_ENTRY = "@agimon-ai/po-cache/extensions/server";
|
|
46
48
|
const SESSION_PACKAGE_ENTRY = "@agimon-ai/po-session/extensions/server";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["fs","path","declaredServerPackagesOf","splitPackageSpecifier","consumerPackageEntry","localPackageExport","localPackageEntries","fileURLToPath","resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName","checkoutPackageEntry","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n checkoutPackageEntry,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerPackagesOf } from '@agimon-ai/po-core/serverPlugin';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native package discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** A fixed Po host package: the only kind whose manifest may make a load failure fatal. */\nexport const isFixedHostPackage = (name: string): boolean => FIXED_CORE_PACKAGES.has(name);\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server package, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_CONTRIBUTION_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server entry, or to its manifest as the discovery\n * anchor of a web or MCP only package. A package with no Po contribution resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerPackagesOf(root, manifest)[0];\n if (!declaration) {\n return PO_CONTRIBUTION_FIELDS.some((field) => manifest[field] !== undefined)\n ? [path.join(root, 'package.json')]\n : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n // A checkout executable with no installed copy in the consumer still runs its own fixed packages.\n const entryOf = (name: string): string | undefined =>\n fallbackEntry(name) ??\n consumerPackageEntry(name, consumerRoot, environment) ??\n (FIXED_CORE_PACKAGES.has(packageName(name)) ? checkoutPackageEntry(name, import.meta.url) : undefined);\n const requiredEntry = (name: string): string => {\n const entry = entryOf(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: entryOf,\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po contribution.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP contribution.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["fs","path","declaredServerPackagesOf","splitPackageSpecifier","consumerPackageEntry","localPackageExport","localPackageEntries","fileURLToPath","resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName","checkoutPackageEntry","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n checkoutPackageEntry,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerPackagesOf } from '@agimon-ai/po-core/serverPlugin';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native package discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-approval',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** A fixed Po host package: the only kind whose manifest may make a load failure fatal. */\nexport const isFixedHostPackage = (name: string): boolean => FIXED_CORE_PACKAGES.has(name);\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n '@agimon-ai/po-approval/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server package, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_CONTRIBUTION_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server entry, or to its manifest as the discovery\n * anchor of a web or MCP only package. A package with no Po contribution resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerPackagesOf(root, manifest)[0];\n if (!declaration) {\n return PO_CONTRIBUTION_FIELDS.some((field) => manifest[field] !== undefined)\n ? [path.join(root, 'package.json')]\n : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n // A checkout executable with no installed copy in the consumer still runs its own fixed packages.\n const entryOf = (name: string): string | undefined =>\n fallbackEntry(name) ??\n consumerPackageEntry(name, consumerRoot, environment) ??\n (FIXED_CORE_PACKAGES.has(packageName(name)) ? checkoutPackageEntry(name, import.meta.url) : undefined);\n const requiredEntry = (name: string): string => {\n const entry = entryOf(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: entryOf,\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po contribution.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP contribution.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;iBAsBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;;EAEf;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;;;;;;EAOZ;;YAGU;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;iBAsBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;;EAEf;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;;;;;;EAOZ;;YAGU;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;;;qBAwBE,qBAAkB;qBAwElB,iBAAiB;;;;;;wBAyBd,qBACd,uBACA,cAAa,OAAO,aACnB;;;;;wBA8Ga,kBAAkB,uBAAuB;;wBAmNzC,4BAA4B,SAAS,mBAAmB"}
|
|
@@ -11,6 +11,7 @@ const DEFAULT_SELECTION_LAYER = "default";
|
|
|
11
11
|
const DEFAULT_SELECTION_LAYER_INDEX = -1;
|
|
12
12
|
const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
|
|
13
13
|
"@agimon-ai/po",
|
|
14
|
+
"@agimon-ai/po-approval",
|
|
14
15
|
"@agimon-ai/po-artifact",
|
|
15
16
|
"@agimon-ai/po-autostop",
|
|
16
17
|
"@agimon-ai/po-cache",
|
|
@@ -36,7 +37,8 @@ const CORE_PACKAGE_ENTRIES = [
|
|
|
36
37
|
"@agimon-ai/po-major-mode/extensions/server",
|
|
37
38
|
"@agimon-ai/po-skill/extensions/server",
|
|
38
39
|
"@agimon-ai/po-domain/extensions/server",
|
|
39
|
-
"@agimon-ai/po-artifact/extensions/server"
|
|
40
|
+
"@agimon-ai/po-artifact/extensions/server",
|
|
41
|
+
"@agimon-ai/po-approval/extensions/server"
|
|
40
42
|
];
|
|
41
43
|
const CACHE_PACKAGE_ENTRY = "@agimon-ai/po-cache/extensions/server";
|
|
42
44
|
const SESSION_PACKAGE_ENTRY = "@agimon-ai/po-session/extensions/server";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n checkoutPackageEntry,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerPackagesOf } from '@agimon-ai/po-core/serverPlugin';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native package discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** A fixed Po host package: the only kind whose manifest may make a load failure fatal. */\nexport const isFixedHostPackage = (name: string): boolean => FIXED_CORE_PACKAGES.has(name);\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server package, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_CONTRIBUTION_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server entry, or to its manifest as the discovery\n * anchor of a web or MCP only package. A package with no Po contribution resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerPackagesOf(root, manifest)[0];\n if (!declaration) {\n return PO_CONTRIBUTION_FIELDS.some((field) => manifest[field] !== undefined)\n ? [path.join(root, 'package.json')]\n : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n // A checkout executable with no installed copy in the consumer still runs its own fixed packages.\n const entryOf = (name: string): string | undefined =>\n fallbackEntry(name) ??\n consumerPackageEntry(name, consumerRoot, environment) ??\n (FIXED_CORE_PACKAGES.has(packageName(name)) ? checkoutPackageEntry(name, import.meta.url) : undefined);\n const requiredEntry = (name: string): string => {\n const entry = entryOf(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: entryOf,\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po contribution.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP contribution.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { isLocalPackageSpecifier, type LayerResolvers, type MajorModesConfig } from '@agimon-ai/po-config/majorModes';\nimport {\n checkoutPackageEntry,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageExport,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntry as resolvePackageEntry,\n splitPackageSpecifier,\n} from '@agimon-ai/po-core/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/po-core/runtimeIdentity';\nimport { declaredServerPackagesOf } from '@agimon-ai/po-core/serverPlugin';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages to its native discovery anchor. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n /**\n * Turns a configured package that does not resolve yet (not installed, or a local package\n * not built) into a missing selection with a diagnostic instead of an error, so a host that\n * only reads what sync prepared can still open. A fixed host package selected as a feature\n * still throws: that is a configuration error, not something sync can fix.\n */\n tolerateUnsynced?: boolean;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to Po composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by sync, bundles, and the session server. */\nexport interface ExtensionComposition {\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Entries whose owning packages this composition selects, for native package discovery. */\n readonly packageEntries: readonly string[];\n /** Stable identity of this composition, published as the session's composition fingerprint. */\n readonly fingerprint: string;\n}\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/po',\n '@agimon-ai/po-approval',\n '@agimon-ai/po-artifact',\n '@agimon-ai/po-autostop',\n '@agimon-ai/po-cache',\n '@agimon-ai/po-config',\n '@agimon-ai/po-domain',\n '@agimon-ai/po-major-mode',\n '@agimon-ai/po-minor-mode',\n '@agimon-ai/po-notification',\n '@agimon-ai/po-profile',\n '@agimon-ai/po-session',\n '@agimon-ai/po-skill',\n '@agimon-ai/po-ui',\n]);\n\n/** A fixed Po host package: the only kind whose manifest may make a load failure fatal. */\nexport const isFixedHostPackage = (name: string): boolean => FIXED_CORE_PACKAGES.has(name);\n/** Native server entries of the fixed host packages every composition selects. */\nconst CORE_PACKAGE_ENTRIES = [\n '@agimon-ai/po-minor-mode/extensions/server',\n '@agimon-ai/po-config/extensions/server',\n '@agimon-ai/po-ui/extensions/server',\n '@agimon-ai/po-notification/extensions/server',\n '@agimon-ai/po-profile/extensions/server',\n '@agimon-ai/po-major-mode/extensions/server',\n '@agimon-ai/po-skill/extensions/server',\n '@agimon-ai/po-domain/extensions/server',\n '@agimon-ai/po-artifact/extensions/server',\n '@agimon-ai/po-approval/extensions/server',\n] as const;\nconst CACHE_PACKAGE_ENTRY = '@agimon-ai/po-cache/extensions/server';\nconst SESSION_PACKAGE_ENTRY = '@agimon-ai/po-session/extensions/server';\n/** Po's own server package, resolved through the distribution like any own entry. */\nconst PO_SERVER_ENTRY = 'server';\n\n/** Manifest fields through which a selected package contributes to a Po host. */\nconst PO_CONTRIBUTION_FIELDS = ['poServer', 'poWeb', 'poMcp'] as const;\n\n/**\n * Resolves a selected package to its built server entry, or to its manifest as the discovery\n * anchor of a web or MCP only package. A package with no Po contribution resolves empty.\n */\nfunction nativePackageEntries(manifestPath: string, resolveExport: () => string | undefined): string[] {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n const root = path.dirname(fs.realpathSync(manifestPath));\n const declaration = declaredServerPackagesOf(root, manifest)[0];\n if (!declaration) {\n return PO_CONTRIBUTION_FIELDS.some((field) => manifest[field] !== undefined)\n ? [path.join(root, 'package.json')]\n : [];\n }\n const exported = resolveExport();\n const dist = path.resolve(root, declaration.dist);\n if (!exported || !fs.existsSync(dist) || fs.realpathSync(exported) !== fs.realpathSync(dist)) {\n throw new Error(\n `Native package ${declaration.packageName} must export its built poServer dist as ./extensions/server.`,\n );\n }\n return [fs.realpathSync(dist)];\n}\n\n/** Resolves an installed package selection, or one explicit export subpath, from root. */\nfunction installedPackageEntries(\n specifier: string,\n root: string,\n environment: NodeJS.ProcessEnv = process.env,\n): string[] | undefined {\n if (splitPackageSpecifier(specifier).subpath !== '.') {\n const entry = consumerPackageEntry(specifier, root, environment);\n return entry ? [fs.realpathSync(entry)] : undefined;\n }\n const manifestPath = consumerPackageEntry(`${specifier}/package.json`, root, environment);\n return manifestPath\n ? nativePackageEntries(manifestPath, () =>\n consumerPackageEntry(`${specifier}/extensions/server`, root, environment),\n )\n : undefined;\n}\n\nfunction localSelectedPackageEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const manifest = path.resolve(baseDirectory, specifier, 'package.json');\n return fs.existsSync(manifest)\n ? nativePackageEntries(manifest, () => localPackageExport(specifier, baseDirectory, './extensions/server'))\n : localPackageEntries(specifier, baseDirectory);\n}\n\nconst HOST_DIRECTORY = path.dirname(fileURLToPath(import.meta.url));\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => {\n const entries = installedPackageEntries(specifier, HOST_DIRECTORY);\n if (!entries) throw new Error(`Cannot resolve package ${specifier}.`);\n return entries;\n },\n optionalPackageEntries: (specifier) => installedPackageEntries(specifier, HOST_DIRECTORY),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure. `environment` names\n * the Po home whose shared runtime answers after the consumer's own tree.\n */\nexport function createLayerResolvers(\n consumerRoot?: string,\n environment: NodeJS.ProcessEnv = process.env,\n): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n // A checkout executable with no installed copy in the consumer still runs its own fixed packages.\n const entryOf = (name: string): string | undefined =>\n fallbackEntry(name) ??\n consumerPackageEntry(name, consumerRoot, environment) ??\n (FIXED_CORE_PACKAGES.has(packageName(name)) ? checkoutPackageEntry(name, import.meta.url) : undefined);\n const requiredEntry = (name: string): string => {\n const entry = entryOf(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = installedPackageEntries(name, consumerRoot, environment);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: entryOf,\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => installedPackageEntries(name, consumerRoot, environment),\n localEntry,\n localEntries,\n localPackageEntries: localSelectedPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\n/** A fixed host package selected as a feature: a configuration error that tolerance never hides. */\nclass FixedPackageSelectionError extends Error {}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new FixedPackageSelectionError(\n `Layer \"${layer}\" cannot select fixed Po host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\n/**\n * The selectors a tolerant composition left out because they do not resolve yet: the missing\n * selections of entries that are not optional, each once, in composition order.\n */\nexport function unsyncedSelectors(compositions: readonly ExtensionComposition[]): string[] {\n return [\n ...new Set(\n compositions.flatMap((composition) =>\n composition.selections\n .filter((selection) => selection.outcome === 'missing-optional' && !selection.optional)\n .map((selection) => selection.selector),\n ),\n ),\n ];\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced = false,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional || (tolerateUnsynced && !(error instanceof FixedPackageSelectionError))) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length && tolerateUnsynced && !optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Package \"${selector}\" is not synced yet: it resolves to no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Po server, web or MCP contribution.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a package directory whose package.json declares a Po contribution.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Po server, web or MCP contribution.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers, tolerateUnsynced);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n tolerateUnsynced: boolean,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(\n config.default,\n DEFAULT_SELECTION_LAYER,\n DEFAULT_SELECTION_LAYER_INDEX,\n resolvers,\n tolerateUnsynced,\n );\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers, context.tolerateUnsynced === true),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\n/** Package anchors in the order the previous host activated them, so discovery order holds. */\nfunction selectedPackageEntries(\n resolve: ExtensionLayerResolvers,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n return deduplicatePaths([\n resolve.ownEntry(PO_SERVER_ENTRY),\n ...CORE_PACKAGE_ENTRIES.map((entry) => resolve.packageEntry(entry)),\n ...distributionPaths,\n ...featurePaths,\n resolve.packageEntry(CACHE_PACKAGE_ENTRY),\n resolve.packageEntry(SESSION_PACKAGE_ENTRY),\n ]);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\n/** Resolve one deterministic composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(\n context.majorModesConfig,\n resolvers,\n context.tolerateUnsynced === true,\n );\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const composition = {\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n packageEntries: selectedPackageEntries(resolvers, distributionPaths, featurePaths),\n };\n // Keys the prompt-cache namespace, so a different selection never shares cached prefixes.\n return {\n ...composition,\n fingerprint: sha256(\n JSON.stringify(\n canonicalValue({ ...composition, canonicalEntries: composition.packageEntries.map(canonicalModulePath) }),\n ),\n ),\n };\n}\n"],"mappings":"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"}
|