@north-light/crouter 0.3.227 → 0.3.229
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/dist/api/client.d.ts +5 -5
- package/dist/api/client.js +3 -3
- package/dist/api/dto/broker-ops.d.ts +8 -0
- package/dist/api/dto/memory.d.ts +8 -7
- package/dist/api/dto/memory.js +2 -2
- package/dist/builtin-memory/04-base-worker.md +1 -1
- package/dist/builtin-memory/insights/init.md +5 -5
- package/dist/builtin-memory/internal/INDEX.md +1 -1
- package/dist/builtin-memory/internal/agent-shaping.md +11 -11
- package/dist/builtin-memory/internal/examples/INDEX.md +1 -1
- package/dist/builtin-memory/internal/memory-loading.md +6 -6
- package/dist/builtin-memory/internal/plugins.md +1 -1
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +50 -37
- package/dist/clients/attach/__tests__/pane-tag-successor.test.js +56 -0
- package/dist/clients/attach/__tests__/profile-files.test.js +21 -0
- package/dist/clients/attach/chrome/inbox-strip.js +11 -7
- package/dist/clients/attach/session/pane-tag.d.ts +28 -2
- package/dist/clients/attach/session/pane-tag.js +48 -22
- package/dist/clients/attach/session/profile-files.d.ts +6 -0
- package/dist/clients/attach/session/profile-files.js +44 -11
- package/dist/clients/attach/slash/dispatch.js +4 -7
- package/dist/clients/attach/viewer.js +588 -596
- package/dist/commands/__tests__/surface-reload-target.test.js +21 -0
- package/dist/commands/api-client.d.ts +3 -7
- package/dist/commands/api-client.js +7 -12
- package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +292 -0
- package/dist/commands/memory/__tests__/repository-root-lint.test.js +146 -0
- package/dist/commands/memory/delete.js +51 -24
- package/dist/commands/memory/edit.js +50 -10
- package/dist/commands/memory/find.js +105 -56
- package/dist/commands/memory/history.js +51 -31
- package/dist/commands/memory/lint.d.ts +0 -9
- package/dist/commands/memory/lint.js +78 -322
- package/dist/commands/memory/list.d.ts +12 -4
- package/dist/commands/memory/list.js +64 -25
- package/dist/commands/memory/move.js +103 -73
- package/dist/commands/memory/origin.js +35 -5
- package/dist/commands/memory/read.d.ts +4 -0
- package/dist/commands/memory/read.js +132 -80
- package/dist/commands/memory/shared.d.ts +115 -25
- package/dist/commands/memory/shared.js +331 -74
- package/dist/commands/memory/write.js +72 -21
- package/dist/commands/memory.js +2 -2
- package/dist/commands/node/create.d.ts +1 -1
- package/dist/commands/node/create.js +1 -1
- package/dist/commands/node/inspect.js +1 -1
- package/dist/commands/node/lifecycle.js +5 -5
- package/dist/commands/pkg/market-manage.js +25 -24
- package/dist/commands/pkg/plugin-manage.d.ts +22 -6
- package/dist/commands/pkg/plugin-manage.js +118 -25
- package/dist/commands/pkg/shared.d.ts +8 -0
- package/dist/commands/pkg/shared.js +23 -20
- package/dist/commands/surface-reload.d.ts +5 -0
- package/dist/commands/surface-reload.js +9 -1
- package/dist/commands/sys/__tests__/migrate.test.js +1140 -22
- package/dist/commands/sys/__tests__/sync-project-guidance.test.js +218 -0
- package/dist/commands/sys/migrate.js +126 -140
- package/dist/commands/sys/panels/profiles-panel.d.ts +66 -0
- package/dist/commands/sys/panels/profiles-panel.js +599 -0
- package/dist/commands/sys/settings-shell.d.ts +4 -2
- package/dist/commands/sys/settings-shell.js +35 -4
- package/dist/commands/sys/settings.js +21 -5
- package/dist/commands/sys/sync-deps.d.ts +2 -0
- package/dist/commands/sys/sync-deps.js +26 -15
- package/dist/commands/sys/sync-project-guidance.js +228 -145
- package/dist/commands/sys/sync-skills.js +28 -17
- package/dist/commands/sys/update.js +11 -3
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +15 -2
- package/dist/core/__tests__/config-change-delta.test.js +106 -0
- package/dist/core/__tests__/context-intro.test.js +13 -9
- package/dist/core/__tests__/daemon-boot.test.js +22 -16
- package/dist/core/__tests__/fixtures/memory-slash-live-probe.js +5 -1
- package/dist/core/__tests__/human-deliver.test.js +19 -0
- package/dist/core/__tests__/inline-memory-refs.test.js +50 -46
- package/dist/core/__tests__/{serial → integration}/broker-fork-seam.test.js +1 -1
- package/dist/core/__tests__/{serial → integration}/broker-sdk-wiring.test.js +1 -1
- package/dist/core/__tests__/{serial → integration}/broker-snapshot-history.test.js +1 -1
- package/dist/core/__tests__/{serial → integration}/command-plugins.test.js +94 -3
- package/dist/core/__tests__/{serial → integration}/deferred-no-wake.test.js +1 -1
- package/dist/core/__tests__/{serial → integration}/flagship-lifecycle.test.js +13 -27
- package/dist/core/__tests__/{serial → integration}/host-teardown-process-group.test.js +1 -1
- package/dist/core/__tests__/{serial → integration}/human-deliver-e2e.test.js +1 -1
- package/dist/core/__tests__/{live-mutation-verbs.test.js → integration/live-mutation-verbs.test.js} +22 -33
- package/dist/core/__tests__/{serial → integration}/live-mutation.test.js +21 -41
- package/dist/core/__tests__/integration/refresh-stall-recycle.test.d.ts +1 -0
- package/dist/core/__tests__/{serial → integration}/refresh-stall-recycle.test.js +1 -1
- package/dist/core/__tests__/integration/revive.test.d.ts +1 -0
- package/dist/core/__tests__/{serial → integration}/revive.test.js +38 -19
- package/dist/core/__tests__/integration/spawn-root.test.d.ts +1 -0
- package/dist/core/__tests__/{serial → integration}/spawn-root.test.js +104 -1
- package/dist/core/__tests__/integration/subscription-delivery.test.d.ts +1 -0
- package/dist/core/__tests__/{serial → integration}/subscription-delivery.test.js +1 -1
- package/dist/core/__tests__/integration/tmux-surface.test.d.ts +1 -0
- package/dist/core/__tests__/{serial → integration}/tmux-surface.test.js +1 -1
- package/dist/core/__tests__/integration/worktree-land.test.d.ts +1 -0
- package/dist/core/__tests__/integration/worktree-land.test.js +400 -0
- package/dist/core/__tests__/integration/worktree-reap.test.d.ts +1 -0
- package/dist/core/__tests__/{serial/worktree.test.js → integration/worktree-reap.test.js} +6 -338
- package/dist/core/__tests__/kickoff.test.js +16 -5
- package/dist/core/__tests__/memory-resolver-precedence.test.js +122 -91
- package/dist/core/__tests__/nested-store-discovery.test.js +5 -3
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +2 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +39 -27
- package/dist/core/__tests__/on-read-nested-store.test.js +19 -13
- package/dist/core/__tests__/profile-project-memory-delivery.test.js +138 -44
- package/dist/core/__tests__/repository-association.test.d.ts +1 -0
- package/dist/core/__tests__/repository-association.test.js +153 -0
- package/dist/core/__tests__/repository-root-identity.test.d.ts +1 -0
- package/dist/core/__tests__/repository-root-identity.test.js +219 -0
- package/dist/core/__tests__/review-model-floor.test.js +12 -4
- package/dist/core/__tests__/seam/memory-slash-node-relative-inventory.test.js +27 -11
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.d.ts +1 -0
- package/dist/core/__tests__/warm-claim-preference-snapshot.test.js +40 -0
- package/dist/core/canvas/canvas.d.ts +3 -0
- package/dist/core/canvas/canvas.js +30 -10
- package/dist/core/canvas/db.js +28 -1
- package/dist/core/canvas/paths.d.ts +4 -6
- package/dist/core/canvas/paths.js +8 -6
- package/dist/core/canvas/render-source.js +2 -2
- package/dist/core/canvas/types.d.ts +9 -13
- package/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +3 -3
- package/dist/core/exclusive-lock.d.ts +2 -0
- package/dist/core/exclusive-lock.js +21 -0
- package/dist/core/git.d.ts +0 -1
- package/dist/core/git.js +0 -3
- package/dist/core/human/__tests__/integration/inbox-core.test.d.ts +1 -0
- package/dist/core/human/feedback-companion.js +3 -0
- package/dist/core/human/scan.js +8 -1
- package/dist/core/keybindings/catalog.d.ts +2 -2
- package/dist/core/keybindings/catalog.js +2 -1
- package/dist/core/memory/doc-link-grammar.js +2 -2
- package/dist/core/memory/history.d.ts +24 -0
- package/dist/core/memory/history.js +66 -1
- package/dist/core/memory/identity.d.ts +65 -0
- package/dist/core/memory/identity.js +185 -0
- package/dist/core/memory/inline-ref-guidance.d.ts +1 -1
- package/dist/core/memory/inline-ref-guidance.js +1 -1
- package/dist/core/memory/inline-ref-inventory.d.ts +3 -10
- package/dist/core/memory/inline-ref-inventory.js +30 -62
- package/dist/core/memory/lint.d.ts +129 -0
- package/dist/core/memory/lint.js +517 -0
- package/dist/core/memory/project-namespace.d.ts +31 -0
- package/dist/core/memory/project-namespace.js +85 -0
- package/dist/core/memory/repository-association.d.ts +31 -0
- package/dist/core/memory/repository-association.js +129 -0
- package/dist/core/memory/tree.d.ts +39 -0
- package/dist/core/memory/tree.js +93 -0
- package/dist/core/memory-resolver.d.ts +193 -90
- package/dist/core/memory-resolver.js +461 -375
- package/dist/core/nested-stores.js +6 -13
- package/dist/core/profiles/select.d.ts +4 -1
- package/dist/core/profiles/select.js +108 -48
- package/dist/core/review/__tests__/capture-origin.test.js +2 -2
- package/dist/core/review/__tests__/stage-identity.test.js +2 -2
- package/dist/core/review/companion.js +11 -2
- package/dist/core/runtime/bearings.d.ts +2 -2
- package/dist/core/runtime/bearings.js +3 -3
- package/dist/core/runtime/broker/daemon-ops.d.ts +2 -2
- package/dist/core/runtime/broker/rebind.js +5 -0
- package/dist/core/runtime/broker-extension-render.d.ts +7 -3
- package/dist/core/runtime/broker-extension-render.js +10 -5
- package/dist/core/runtime/broker-persona-guidance.d.ts +19 -5
- package/dist/core/runtime/broker-persona-guidance.js +122 -27
- package/dist/core/runtime/deliver-live.d.ts +16 -4
- package/dist/core/runtime/deliver-live.js +29 -15
- package/dist/core/runtime/kickoff.d.ts +3 -3
- package/dist/core/runtime/kickoff.js +8 -16
- package/dist/core/runtime/launch.js +1 -1
- package/dist/core/runtime/lifecycle.js +2 -3
- package/dist/core/runtime/nodes.d.ts +3 -4
- package/dist/core/runtime/nodes.js +3 -4
- package/dist/core/runtime/persona.d.ts +8 -12
- package/dist/core/runtime/persona.js +24 -96
- package/dist/core/runtime/promote.d.ts +2 -2
- package/dist/core/runtime/promote.js +8 -21
- package/dist/core/runtime/revive.js +20 -17
- package/dist/core/runtime/spawn.js +18 -7
- package/dist/core/runtime/tmux-bindings.js +2 -3
- package/dist/core/runtime/warm-pool.js +3 -4
- package/dist/core/scope.js +2 -0
- package/dist/core/self-update.d.ts +0 -2
- package/dist/core/self-update.js +2 -35
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.d.ts +1 -0
- package/dist/core/substrate/__tests__/surface-match-memory-read.test.js +28 -0
- package/dist/core/substrate/index.d.ts +2 -2
- package/dist/core/substrate/index.js +1 -1
- package/dist/core/substrate/injected-store.d.ts +43 -27
- package/dist/core/substrate/injected-store.js +208 -104
- package/dist/core/substrate/listings.d.ts +19 -12
- package/dist/core/substrate/listings.js +75 -52
- package/dist/core/substrate/on-read-node.d.ts +4 -7
- package/dist/core/substrate/on-read-node.js +6 -8
- package/dist/core/substrate/on-read.d.ts +22 -25
- package/dist/core/substrate/on-read.js +103 -147
- package/dist/core/substrate/render-node.d.ts +4 -7
- package/dist/core/substrate/render-node.js +5 -7
- package/dist/core/substrate/render.d.ts +21 -3
- package/dist/core/substrate/render.js +291 -223
- package/dist/core/substrate/schema.d.ts +1 -13
- package/dist/core/substrate/schema.js +5 -40
- package/dist/core/substrate/session-cache.d.ts +14 -4
- package/dist/core/substrate/session-cache.js +40 -22
- package/dist/core/substrate/surface-match.d.ts +9 -7
- package/dist/core/substrate/surface-match.js +26 -25
- package/dist/daemon/__tests__/helpers/source-daemon.d.ts +30 -0
- package/dist/daemon/__tests__/helpers/source-daemon.js +174 -0
- package/dist/daemon/__tests__/integration/migration-startup.test.d.ts +1 -0
- package/dist/daemon/__tests__/integration/migration-startup.test.js +97 -0
- package/dist/daemon/api/__tests__/bridge-heartbeat.test.js +21 -5
- package/dist/daemon/api/handlers/broker-ops.js +21 -16
- package/dist/daemon/api/handlers/memory.js +2 -0
- package/dist/daemon/crtrd.js +2 -0
- package/dist/daemon/human/finish.js +8 -1
- package/dist/daemon/manage.d.ts +0 -1
- package/dist/daemon/manage.js +7 -16
- package/dist/daemon/startup-policy.d.ts +1 -0
- package/dist/daemon/startup-policy.js +1 -0
- package/dist/migrations/001-surfaces-frontmatter.js +21 -109
- package/dist/migrations/002-profile-project-memory.js +1 -0
- package/dist/migrations/003-repository-root-memory-identity/front-door.d.ts +26 -0
- package/dist/migrations/003-repository-root-memory-identity/front-door.js +231 -0
- package/dist/migrations/003-repository-root-memory-identity/index.d.ts +2 -0
- package/dist/migrations/003-repository-root-memory-identity/index.js +513 -0
- package/dist/migrations/003-repository-root-memory-identity/references.d.ts +95 -0
- package/dist/migrations/003-repository-root-memory-identity/references.js +469 -0
- package/dist/migrations/003-repository-root-memory-identity/repository-facts.d.ts +39 -0
- package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +349 -0
- package/dist/migrations/__tests__/activation-concurrency.test.d.ts +1 -0
- package/dist/migrations/__tests__/activation-concurrency.test.js +145 -0
- package/dist/migrations/__tests__/activation.test.d.ts +1 -0
- package/dist/migrations/__tests__/activation.test.js +149 -0
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.d.ts +1 -0
- package/dist/migrations/__tests__/deletion-and-root-declaration.test.js +149 -0
- package/dist/migrations/activation.d.ts +16 -0
- package/dist/migrations/activation.js +78 -0
- package/dist/migrations/convergent.d.ts +14 -3
- package/dist/migrations/convergent.js +21 -10
- package/dist/migrations/corpus.d.ts +78 -0
- package/dist/migrations/corpus.js +497 -0
- package/dist/migrations/frontmatter-splice.d.ts +15 -0
- package/dist/migrations/frontmatter-splice.js +176 -0
- package/dist/migrations/registry.d.ts +6 -1
- package/dist/migrations/registry.js +7 -2
- package/dist/migrations/runner.d.ts +41 -0
- package/dist/migrations/runner.js +81 -0
- package/dist/migrations/types.d.ts +148 -9
- package/dist/migrations/types.js +9 -2
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +225 -17
- package/dist/pi-extensions/__tests__/canvas-goal-capture-envelope.test.js +11 -3
- package/dist/pi-extensions/canvas-context-intro.d.ts +3 -5
- package/dist/pi-extensions/canvas-context-intro.js +50 -46
- package/dist/pi-extensions/canvas-doc-substrate.d.ts +1 -8
- package/dist/pi-extensions/canvas-doc-substrate.js +55 -122
- package/dist/pi-extensions/canvas-stophook.js +6 -13
- package/dist/shared/generated-context.d.ts +0 -3
- package/dist/shared/generated-context.js +0 -57
- package/dist/shared/tool-groups.js +2 -3
- package/dist/types.d.ts +8 -11
- package/dist/types.js +4 -31
- package/package.json +5 -4
- package/runtime.lock.json +2 -2
- package/dist/builtin-memory/05-kinds/design/00-base.md +0 -17
- package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +0 -15
- package/dist/builtin-memory/05-kinds/design/design-contract.md +0 -19
- package/dist/builtin-memory/05-kinds/developer/00-base.md +0 -17
- package/dist/builtin-memory/05-kinds/developer/01-orchestrator.md +0 -15
- package/dist/builtin-memory/05-kinds/plan/00-base.md +0 -17
- package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +0 -17
- package/dist/builtin-memory/05-kinds/plan/plan-contract.md +0 -28
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +0 -15
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +0 -15
- package/dist/builtin-memory/05-kinds/plan/reviewers/lens-contract.md +0 -13
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +0 -17
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +0 -17
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +0 -17
- package/dist/builtin-memory/05-kinds/spec/00-base.md +0 -17
- package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +0 -15
- package/dist/builtin-memory/05-kinds/spec/requirements.md +0 -15
- package/dist/builtin-memory/design/guide.md +0 -35
- package/dist/builtin-memory/design/roadmap.md +0 -21
- package/dist/builtin-memory/development.md +0 -113
- package/dist/builtin-memory/plan/roadmap.md +0 -25
- package/dist/builtin-memory/spec/guide.md +0 -53
- package/dist/builtin-memory/spec/requirements.md +0 -29
- package/dist/builtin-memory/spec/roadmap.md +0 -36
- package/dist/builtin-memory/testing.md +0 -39
- /package/dist/api/__tests__/{serial → integration}/client.test.d.ts +0 -0
- /package/dist/api/__tests__/{serial → integration}/client.test.js +0 -0
- /package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/{serial → integration}/provider-rotation.test.ts +0 -0
- /package/dist/clients/{inbox/__tests__/serial/inbox-controller.test.d.ts → attach/__tests__/pane-tag-successor.test.d.ts} +0 -0
- /package/dist/clients/{inbox/__tests__/serial/mount-panel.test.d.ts → attach/__tests__/profile-files.test.d.ts} +0 -0
- /package/dist/{core/__tests__/live-mutation-verbs.test.d.ts → clients/inbox/__tests__/integration/inbox-controller.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{serial → integration}/inbox-controller.test.js +0 -0
- /package/dist/{core/__tests__/serial/broker-fork-seam.test.d.ts → clients/inbox/__tests__/integration/mount-panel.test.d.ts} +0 -0
- /package/dist/clients/inbox/__tests__/{serial → integration}/mount-panel.test.js +0 -0
- /package/dist/{core/__tests__/serial/broker-sdk-wiring.test.d.ts → commands/__tests__/surface-reload-target.test.d.ts} +0 -0
- /package/dist/{core/__tests__/serial/broker-snapshot-history.test.d.ts → commands/memory/__tests__/command-selector-and-mutation-guards.test.d.ts} +0 -0
- /package/dist/{core/__tests__/serial/command-plugins.test.d.ts → commands/memory/__tests__/repository-root-lint.test.d.ts} +0 -0
- /package/dist/{core/__tests__/serial/deferred-no-wake.test.d.ts → commands/sys/__tests__/sync-project-guidance.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/flagship-lifecycle.test.d.ts → config-change-delta.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/host-teardown-process-group.test.d.ts → integration/broker-fork-seam.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/human-deliver-e2e.test.d.ts → integration/broker-sdk-wiring.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/live-mutation.test.d.ts → integration/broker-snapshot-history.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/refresh-stall-recycle.test.d.ts → integration/command-plugins.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/revive.test.d.ts → integration/deferred-no-wake.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/spawn-root.test.d.ts → integration/flagship-lifecycle.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/subscription-delivery.test.d.ts → integration/host-teardown-process-group.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/tmux-surface.test.d.ts → integration/human-deliver-e2e.test.d.ts} +0 -0
- /package/dist/core/__tests__/{serial/worktree.test.d.ts → integration/live-mutation-verbs.test.d.ts} +0 -0
- /package/dist/core/{human/__tests__/serial/inbox-core.test.d.ts → __tests__/integration/live-mutation.test.d.ts} +0 -0
- /package/dist/core/human/__tests__/{serial → integration}/inbox-core.test.js +0 -0
|
@@ -5,50 +5,76 @@
|
|
|
5
5
|
// local id) from that pane. `@crtr_attach` carries no identity: every local or
|
|
6
6
|
// remote attach viewer sets it so tmux can conditionally forward opted-in root
|
|
7
7
|
// gestures into whichever attach pane currently has focus.
|
|
8
|
-
import { currentTmux, setPaneOption, stampViewerPaneAsync, VIEWER_STAMP_OPTION, } from '../../../core/runtime/placement-tmux.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export function createPaneTag(remote, nodeId) {
|
|
8
|
+
import { currentTmux, getPaneOption, setPaneOption, stampViewerPaneAsync, VIEWER_STAMP_OPTION, } from '../../../core/runtime/placement-tmux.js';
|
|
9
|
+
const realPaneTagIo = {
|
|
10
|
+
readOption: getPaneOption,
|
|
11
|
+
writeOption: (pane, name, value) => { setPaneOption(pane, name, value); },
|
|
12
|
+
stampAsync: stampViewerPaneAsync,
|
|
13
|
+
currentPane: () => process.env['TMUX_PANE'] ?? currentTmux()?.pane,
|
|
14
|
+
ownerId: () => String(process.pid),
|
|
15
|
+
};
|
|
16
|
+
export function createPaneTag(remote, nodeId, io = realPaneTagIo) {
|
|
18
17
|
let pane;
|
|
18
|
+
const ownerPid = io.ownerId();
|
|
19
|
+
/** False once another viewer's pid is on the pane. An unclaimed pane (no pid
|
|
20
|
+
* recorded — a viewer that never reached `set()`, or one from a generation
|
|
21
|
+
* that predates this option) keeps the old unconditional behavior. */
|
|
22
|
+
const stillOwnsPane = () => {
|
|
23
|
+
if (pane === undefined || pane === '')
|
|
24
|
+
return true;
|
|
25
|
+
const claimed = io.readOption(pane, VIEWER_OWNER_OPTION);
|
|
26
|
+
if (claimed === undefined || claimed === '')
|
|
27
|
+
return true;
|
|
28
|
+
return claimed === ownerPid;
|
|
29
|
+
};
|
|
19
30
|
return {
|
|
20
31
|
set: () => {
|
|
21
|
-
pane =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
pane = io.currentPane();
|
|
33
|
+
claimAttachPane(pane, ownerPid, io.writeOption);
|
|
34
|
+
tagAttachPane(remote, pane, nodeId, io.writeOption);
|
|
35
|
+
tagAttachViewerPane(pane, io.writeOption);
|
|
36
|
+
stampAttachPane(remote, pane, io.writeOption);
|
|
25
37
|
},
|
|
26
38
|
stamp: () => {
|
|
27
39
|
if (remote || pane === undefined || pane === '')
|
|
28
40
|
return;
|
|
29
|
-
|
|
41
|
+
io.stampAsync(pane);
|
|
30
42
|
},
|
|
31
43
|
clear: () => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
if (!stillOwnsPane())
|
|
45
|
+
return;
|
|
46
|
+
untagAttachPane(remote, pane, io.writeOption);
|
|
47
|
+
untagAttachViewerPane(pane, io.writeOption);
|
|
48
|
+
unstampAttachPane(remote, pane, io.writeOption);
|
|
49
|
+
claimAttachPane(pane, '', io.writeOption);
|
|
35
50
|
},
|
|
36
51
|
pane: () => pane,
|
|
37
52
|
};
|
|
38
53
|
}
|
|
39
|
-
|
|
54
|
+
/** Which viewer process owns this pane's tags. Read only by `clear()`, so a
|
|
55
|
+
* departing viewer never removes a successor's identity. */
|
|
56
|
+
export const VIEWER_OWNER_OPTION = '@crtr_viewer_pid';
|
|
57
|
+
function claimAttachPane(pane, ownerPid, setOpt) {
|
|
58
|
+
if (pane === undefined || pane === '')
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
setOpt(pane, VIEWER_OWNER_OPTION, ownerPid);
|
|
62
|
+
}
|
|
63
|
+
catch { /* best-effort */ }
|
|
64
|
+
}
|
|
65
|
+
function stampAttachPane(remote, pane, setOpt) {
|
|
40
66
|
if (remote || pane === undefined || pane === '')
|
|
41
67
|
return;
|
|
42
68
|
try {
|
|
43
|
-
|
|
69
|
+
setOpt(pane, VIEWER_STAMP_OPTION, String(Date.now()));
|
|
44
70
|
}
|
|
45
71
|
catch { /* best-effort */ }
|
|
46
72
|
}
|
|
47
|
-
function unstampAttachPane(remote, pane) {
|
|
73
|
+
function unstampAttachPane(remote, pane, setOpt = setPaneOption) {
|
|
48
74
|
if (remote || pane === undefined || pane === '')
|
|
49
75
|
return;
|
|
50
76
|
try {
|
|
51
|
-
|
|
77
|
+
setOpt(pane, VIEWER_STAMP_OPTION, '');
|
|
52
78
|
}
|
|
53
79
|
catch { /* best-effort */ }
|
|
54
80
|
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import type { NodeRow } from '../../../core/canvas/types.js';
|
|
1
2
|
interface ProfileFileSearchOptions {
|
|
2
3
|
cwd: string;
|
|
4
|
+
nodeDirs: readonly string[];
|
|
3
5
|
profileId: string | null;
|
|
4
6
|
fdPath: string | null;
|
|
5
7
|
onNotice: (message: string) => void;
|
|
6
8
|
}
|
|
9
|
+
/** Return the working directories for this node, its complete parent chain,
|
|
10
|
+
* and its full descendant subtree. The `parent` hierarchy, rather than the
|
|
11
|
+
* subscription graph, is the user-visible child/parent relationship. */
|
|
12
|
+
export declare function relatedNodeDirs(nodes: readonly Pick<NodeRow, 'node_id' | 'cwd' | 'parent'>[], nodeId: string): string[];
|
|
7
13
|
export declare function launchProfileFileSearch(opts: ProfileFileSearchOptions): void;
|
|
8
14
|
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// session/profile-files.ts — fuzzy file search across a node's local profile.
|
|
1
|
+
// session/profile-files.ts — fuzzy file search across a node's working family and local profile.
|
|
2
2
|
//
|
|
3
|
-
// The popup searches the current workspace, every
|
|
4
|
-
//
|
|
5
|
-
// `.crouter/memory/` stores are added with
|
|
6
|
-
// memory remains findable even when a parent
|
|
7
|
-
//
|
|
8
|
-
//
|
|
3
|
+
// The popup searches the current workspace, every ancestor and descendant
|
|
4
|
+
// node's workspace, every project named by the node's profile manifest, and the
|
|
5
|
+
// profile's own memory store. Ancestor `.crouter/memory/` stores are added with
|
|
6
|
+
// ignore rules disabled, so project memory remains findable even when a parent
|
|
7
|
+
// ignore file hides `.crouter/`. fzf owns matching and selection and nvim owns
|
|
8
|
+
// viewing; the attach viewer resolves the related nodes and wires the two popups.
|
|
9
9
|
import { constants, accessSync, existsSync, mkdtempSync, readFileSync, rmSync, statSync } from 'node:fs';
|
|
10
10
|
import { tmpdir } from 'node:os';
|
|
11
11
|
import { delimiter, dirname, join, resolve, sep } from 'node:path';
|
|
@@ -13,6 +13,31 @@ import { execFile, spawnSync } from 'node:child_process';
|
|
|
13
13
|
import { loadProfileManifest, profileMemoryDir } from '../../../core/profiles/manifest.js';
|
|
14
14
|
import { shellQuote } from '../../../core/runtime/placement-tmux.js';
|
|
15
15
|
import { surfaceTmuxStyleArgs } from '../../../core/runtime/surface-bg.js';
|
|
16
|
+
/** Return the working directories for this node, its complete parent chain,
|
|
17
|
+
* and its full descendant subtree. The `parent` hierarchy, rather than the
|
|
18
|
+
* subscription graph, is the user-visible child/parent relationship. */
|
|
19
|
+
export function relatedNodeDirs(nodes, nodeId) {
|
|
20
|
+
const byId = new Map(nodes.map((node) => [node.node_id, node]));
|
|
21
|
+
const included = new Set([nodeId]);
|
|
22
|
+
for (let current = byId.get(nodeId); current?.parent !== null && current?.parent !== undefined;) {
|
|
23
|
+
const parentId = current.parent;
|
|
24
|
+
if (included.has(parentId))
|
|
25
|
+
break;
|
|
26
|
+
included.add(parentId);
|
|
27
|
+
current = byId.get(parentId);
|
|
28
|
+
}
|
|
29
|
+
const pending = [nodeId];
|
|
30
|
+
while (pending.length > 0) {
|
|
31
|
+
const parentId = pending.pop();
|
|
32
|
+
for (const child of nodes) {
|
|
33
|
+
if (child.parent !== parentId || included.has(child.node_id))
|
|
34
|
+
continue;
|
|
35
|
+
included.add(child.node_id);
|
|
36
|
+
pending.push(child.node_id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return nodes.filter((node) => included.has(node.node_id)).map((node) => node.cwd);
|
|
40
|
+
}
|
|
16
41
|
function isDirectory(path) {
|
|
17
42
|
try {
|
|
18
43
|
return statSync(path).isDirectory();
|
|
@@ -93,6 +118,9 @@ function ancestorMemoryDirs(pointers) {
|
|
|
93
118
|
}
|
|
94
119
|
return dedupeExistingDirs(found);
|
|
95
120
|
}
|
|
121
|
+
/** Columns fzf keeps to the right of the matched substring when it scrolls a
|
|
122
|
+
* long path into view. Wide enough to show the rest of the filename. */
|
|
123
|
+
const HSCROLL_OFF = 20;
|
|
96
124
|
function selectionPath(path) {
|
|
97
125
|
try {
|
|
98
126
|
const bytes = readFileSync(path);
|
|
@@ -122,7 +150,7 @@ export function launchProfileFileSearch(opts) {
|
|
|
122
150
|
return;
|
|
123
151
|
}
|
|
124
152
|
const profile = profileSearchRoots(opts.profileId);
|
|
125
|
-
const pointers = dedupeExistingDirs([opts.cwd, ...profile.projects]);
|
|
153
|
+
const pointers = dedupeExistingDirs([opts.cwd, ...opts.nodeDirs, ...profile.projects]);
|
|
126
154
|
if (pointers.length === 0) {
|
|
127
155
|
opts.onNotice('No profile file-search directories exist');
|
|
128
156
|
return;
|
|
@@ -134,11 +162,16 @@ export function launchProfileFileSearch(opts) {
|
|
|
134
162
|
]);
|
|
135
163
|
const tempDir = mkdtempSync(join(tmpdir(), 'crtr-profile-files-'));
|
|
136
164
|
const selected = join(tempDir, 'selection');
|
|
165
|
+
const candidates = join(tempDir, 'candidates');
|
|
137
166
|
const scans = [
|
|
138
|
-
...roots.map((root) => `${shellQuote(fd)} --type f --hidden --exclude .git --exclude ${shellQuote('**/.crouter/memory/**')}
|
|
139
|
-
...memoryDirs.map((memory) => `${shellQuote(fd)} --type f --hidden --exclude .git --no-ignore
|
|
167
|
+
...roots.map((root) => `${shellQuote(fd)} --type f --hidden --exclude .git --exclude ${shellQuote('**/.crouter/memory/**')} . ${shellQuote(root)}`),
|
|
168
|
+
...memoryDirs.map((memory) => `${shellQuote(fd)} --type f --hidden --exclude .git --no-ignore . ${shellQuote(memory)}`),
|
|
140
169
|
];
|
|
141
|
-
|
|
170
|
+
// Every line is the whole path and nothing else, so fzf matches, ranks, and
|
|
171
|
+
// horizontally scrolls against the same text — a hidden field would be
|
|
172
|
+
// unsearchable, and a display slice would silently narrow the query.
|
|
173
|
+
const yankPath = 'printf \'%s\' {} | { if command -v pbcopy >/dev/null 2>&1; then pbcopy; elif command -v wl-copy >/dev/null 2>&1; then wl-copy; elif command -v xclip >/dev/null 2>&1; then xclip -selection clipboard; else cat >/dev/null; fi; }; printf \'%s\' {} | tmux load-buffer -w -';
|
|
174
|
+
const command = `{ ${scans.map((scan) => `${scan} &`).join(' ')} wait; } > ${shellQuote(candidates)} && ${shellQuote(fzf)} --print0 --scheme=path --hscroll-off=${HSCROLL_OFF} --header ${shellQuote('fuzzy path • ctrl-y yank file path')} --bind ${shellQuote(`ctrl-y:execute-silent(${yankPath})`)} --preview ${shellQuote('head -100 -- {}')} < ${shellQuote(candidates)} > ${shellQuote(selected)}`;
|
|
142
175
|
try {
|
|
143
176
|
execFile('tmux', ['display-popup', '-E', '-T', ' profile files ', '-w', '80%', '-h', '60%', ...surfaceTmuxStyleArgs(), command], () => {
|
|
144
177
|
const file = selectionPath(selected);
|
|
@@ -396,11 +396,8 @@ function dispatchCanvasCommand(name, arg, ctx) {
|
|
|
396
396
|
return true;
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
-
/** `/promote [kind]`
|
|
400
|
-
*
|
|
401
|
-
* this node (out-of-process), notifies the result, then triggers a turn so the
|
|
402
|
-
* persona injector steers in the new-role guidance at the turn boundary — exactly
|
|
403
|
-
* as the node would by running the command itself. */
|
|
399
|
+
/** `/promote [kind]` shells the out-of-process mutation, reports it, then
|
|
400
|
+
* triggers a turn whose provider gate appends the pending transition context. */
|
|
404
401
|
function promoteNode(arg, ctx) {
|
|
405
402
|
const nodeId = nodeIdFor(ctx).trim();
|
|
406
403
|
if (nodeId === '') {
|
|
@@ -446,8 +443,8 @@ function promoteNode(arg, ctx) {
|
|
|
446
443
|
}
|
|
447
444
|
const rmPath = (result.roadmap_path ?? '').trim();
|
|
448
445
|
ctx.notify(`Promoted to ${result.kind ?? 'orchestrator'} orchestrator — authoring roadmap${rmPath !== '' ? ` (${rmPath})` : ''}.`);
|
|
449
|
-
// Trigger a turn so the
|
|
450
|
-
//
|
|
446
|
+
// Trigger a turn so the pending transition lands before the promoted
|
|
447
|
+
// node's response; the viewer's only turn trigger is `prompt`.
|
|
451
448
|
ctx.send({
|
|
452
449
|
type: 'prompt',
|
|
453
450
|
text: 'You have just been promoted to an orchestrator. Your new-role guidance is arriving — read it, author your roadmap, and start delegating.',
|