ctxr-cli 0.33.0 → 0.35.0
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 +40 -6
- package/dist/commands/archive.d.ts +5 -4
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +7 -7
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/catalog-show.d.ts +8 -0
- package/dist/commands/catalog-show.d.ts.map +1 -1
- package/dist/commands/catalog-show.js +29 -2
- package/dist/commands/catalog-show.js.map +1 -1
- package/dist/commands/context-gather.d.ts.map +1 -1
- package/dist/commands/context-gather.js +3 -2
- package/dist/commands/context-gather.js.map +1 -1
- package/dist/commands/doctor.d.ts +5 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +4 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/graph-build.d.ts +4 -1
- package/dist/commands/graph-build.d.ts.map +1 -1
- package/dist/commands/graph-build.js +14 -5
- package/dist/commands/graph-build.js.map +1 -1
- package/dist/commands/land.d.ts +27 -7
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +307 -32
- package/dist/commands/land.js.map +1 -1
- package/dist/commands/plugin-build.d.ts +33 -0
- package/dist/commands/plugin-build.d.ts.map +1 -0
- package/dist/commands/plugin-build.js +51 -0
- package/dist/commands/plugin-build.js.map +1 -0
- package/dist/commands/publish-check.d.ts.map +1 -1
- package/dist/commands/publish-check.js +35 -4
- package/dist/commands/publish-check.js.map +1 -1
- package/dist/commands/publish-gather.d.ts.map +1 -1
- package/dist/commands/publish-gather.js +2 -3
- package/dist/commands/publish-gather.js.map +1 -1
- package/dist/commands/review-list.d.ts +19 -5
- package/dist/commands/review-list.d.ts.map +1 -1
- package/dist/commands/review-list.js +55 -6
- package/dist/commands/review-list.js.map +1 -1
- package/dist/commands/rollup-gather.d.ts.map +1 -1
- package/dist/commands/rollup-gather.js +2 -3
- package/dist/commands/rollup-gather.js.map +1 -1
- package/dist/commands/second-opinion.d.ts +33 -0
- package/dist/commands/second-opinion.d.ts.map +1 -0
- package/dist/commands/second-opinion.js +56 -0
- package/dist/commands/second-opinion.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +14 -2
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-discard.d.ts +18 -0
- package/dist/commands/session-discard.d.ts.map +1 -0
- package/dist/commands/session-discard.js +31 -0
- package/dist/commands/session-discard.js.map +1 -0
- package/dist/commands/session-list.d.ts +17 -6
- package/dist/commands/session-list.d.ts.map +1 -1
- package/dist/commands/session-list.js +31 -11
- package/dist/commands/session-list.js.map +1 -1
- package/dist/commands/session-rebase.d.ts +18 -0
- package/dist/commands/session-rebase.d.ts.map +1 -0
- package/dist/commands/session-rebase.js +43 -0
- package/dist/commands/session-rebase.js.map +1 -0
- package/dist/commands/session-start.d.ts +8 -0
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +52 -38
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-status.d.ts +17 -0
- package/dist/commands/session-status.d.ts.map +1 -0
- package/dist/commands/session-status.js +38 -0
- package/dist/commands/session-status.js.map +1 -0
- package/dist/commands/session-submit.d.ts +23 -0
- package/dist/commands/session-submit.d.ts.map +1 -0
- package/dist/commands/session-submit.js +42 -0
- package/dist/commands/session-submit.js.map +1 -0
- package/dist/commands/shared-stores-status.d.ts +24 -0
- package/dist/commands/shared-stores-status.d.ts.map +1 -0
- package/dist/commands/shared-stores-status.js +51 -0
- package/dist/commands/shared-stores-status.js.map +1 -0
- package/dist/commands/shared-stores-sync.d.ts +27 -0
- package/dist/commands/shared-stores-sync.d.ts.map +1 -0
- package/dist/commands/shared-stores-sync.js +115 -0
- package/dist/commands/shared-stores-sync.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -4
- package/dist/commands/verify.js.map +1 -1
- package/dist/config/schema.d.ts +16 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +32 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/agents-doc.d.ts +10 -0
- package/dist/core/agents-doc.d.ts.map +1 -1
- package/dist/core/agents-doc.js +26 -1
- package/dist/core/agents-doc.js.map +1 -1
- package/dist/core/approval/decision.d.ts +39 -1
- package/dist/core/approval/decision.d.ts.map +1 -1
- package/dist/core/approval/decision.js +53 -6
- package/dist/core/approval/decision.js.map +1 -1
- package/dist/core/approval/session-group.d.ts +156 -0
- package/dist/core/approval/session-group.d.ts.map +1 -0
- package/dist/core/approval/session-group.js +359 -0
- package/dist/core/approval/session-group.js.map +1 -0
- package/dist/core/approval/session-marker.d.ts +79 -0
- package/dist/core/approval/session-marker.d.ts.map +1 -0
- package/dist/core/approval/session-marker.js +146 -0
- package/dist/core/approval/session-marker.js.map +1 -0
- package/dist/core/approval/store-forges.d.ts +15 -0
- package/dist/core/approval/store-forges.d.ts.map +1 -0
- package/dist/core/approval/store-forges.js +33 -0
- package/dist/core/approval/store-forges.js.map +1 -0
- package/dist/core/browse/approve.d.ts +8 -0
- package/dist/core/browse/approve.d.ts.map +1 -1
- package/dist/core/browse/approve.js +366 -48
- package/dist/core/browse/approve.js.map +1 -1
- package/dist/core/browse/link-resolver.d.ts +9 -4
- package/dist/core/browse/link-resolver.d.ts.map +1 -1
- package/dist/core/browse/link-resolver.js +12 -7
- package/dist/core/browse/link-resolver.js.map +1 -1
- package/dist/core/browse/review.d.ts +5 -0
- package/dist/core/browse/review.d.ts.map +1 -1
- package/dist/core/browse/review.js +8 -0
- package/dist/core/browse/review.js.map +1 -1
- package/dist/core/checks/integrity-checks.d.ts.map +1 -1
- package/dist/core/checks/integrity-checks.js +7 -1
- package/dist/core/checks/integrity-checks.js.map +1 -1
- package/dist/core/checks/manifest.d.ts.map +1 -1
- package/dist/core/checks/manifest.js +2 -0
- package/dist/core/checks/manifest.js.map +1 -1
- package/dist/core/checks/shared-stores-checks.d.ts +17 -0
- package/dist/core/checks/shared-stores-checks.d.ts.map +1 -0
- package/dist/core/checks/shared-stores-checks.js +84 -0
- package/dist/core/checks/shared-stores-checks.js.map +1 -0
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +21 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/github.d.ts +14 -0
- package/dist/core/forge/github.d.ts.map +1 -1
- package/dist/core/forge/github.js +17 -0
- package/dist/core/forge/github.js.map +1 -1
- package/dist/core/fs/atomic.d.ts +3 -2
- package/dist/core/fs/atomic.d.ts.map +1 -1
- package/dist/core/fs/atomic.js +3 -2
- package/dist/core/fs/atomic.js.map +1 -1
- package/dist/core/git/fast-forward.d.ts +23 -0
- package/dist/core/git/fast-forward.d.ts.map +1 -0
- package/dist/core/git/fast-forward.js +38 -0
- package/dist/core/git/fast-forward.js.map +1 -0
- package/dist/core/git/repo.d.ts +11 -0
- package/dist/core/git/repo.d.ts.map +1 -1
- package/dist/core/git/repo.js +25 -0
- package/dist/core/git/repo.js.map +1 -1
- package/dist/core/graph/model.d.ts +27 -0
- package/dist/core/graph/model.d.ts.map +1 -1
- package/dist/core/graph/model.js +68 -2
- package/dist/core/graph/model.js.map +1 -1
- package/dist/core/graph/persist.d.ts.map +1 -1
- package/dist/core/graph/persist.js +3 -2
- package/dist/core/graph/persist.js.map +1 -1
- package/dist/core/mcp/cli-runner.d.ts +41 -0
- package/dist/core/mcp/cli-runner.d.ts.map +1 -0
- package/dist/core/mcp/cli-runner.js +81 -0
- package/dist/core/mcp/cli-runner.js.map +1 -0
- package/dist/core/mcp/jsonrpc.d.ts +13 -1
- package/dist/core/mcp/jsonrpc.d.ts.map +1 -1
- package/dist/core/mcp/jsonrpc.js +1 -1
- package/dist/core/mcp/jsonrpc.js.map +1 -1
- package/dist/core/mcp/member-sessions.d.ts +48 -0
- package/dist/core/mcp/member-sessions.d.ts.map +1 -0
- package/dist/core/mcp/member-sessions.js +85 -0
- package/dist/core/mcp/member-sessions.js.map +1 -0
- package/dist/core/mcp/ownership.d.ts +51 -0
- package/dist/core/mcp/ownership.d.ts.map +1 -0
- package/dist/core/mcp/ownership.js +101 -0
- package/dist/core/mcp/ownership.js.map +1 -0
- package/dist/core/mcp/paths.d.ts +48 -0
- package/dist/core/mcp/paths.d.ts.map +1 -0
- package/dist/core/mcp/paths.js +111 -0
- package/dist/core/mcp/paths.js.map +1 -0
- package/dist/core/mcp/sessions.d.ts +25 -50
- package/dist/core/mcp/sessions.d.ts.map +1 -1
- package/dist/core/mcp/sessions.js +31 -123
- package/dist/core/mcp/sessions.js.map +1 -1
- package/dist/core/mcp/tool-map.d.ts +94 -0
- package/dist/core/mcp/tool-map.d.ts.map +1 -0
- package/dist/core/mcp/tool-map.js +211 -0
- package/dist/core/mcp/tool-map.js.map +1 -0
- package/dist/core/mcp/tools/capture.d.ts +7 -2
- package/dist/core/mcp/tools/capture.d.ts.map +1 -1
- package/dist/core/mcp/tools/capture.js +69 -18
- package/dist/core/mcp/tools/capture.js.map +1 -1
- package/dist/core/mcp/tools/cli.d.ts +97 -0
- package/dist/core/mcp/tools/cli.d.ts.map +1 -0
- package/dist/core/mcp/tools/cli.js +271 -0
- package/dist/core/mcp/tools/cli.js.map +1 -0
- package/dist/core/mcp/tools/edit.d.ts +62 -28
- package/dist/core/mcp/tools/edit.d.ts.map +1 -1
- package/dist/core/mcp/tools/edit.js +182 -153
- package/dist/core/mcp/tools/edit.js.map +1 -1
- package/dist/core/mcp/tools/files.d.ts +37 -11
- package/dist/core/mcp/tools/files.d.ts.map +1 -1
- package/dist/core/mcp/tools/files.js +122 -100
- package/dist/core/mcp/tools/files.js.map +1 -1
- package/dist/core/mcp/tools/index.d.ts +12 -3
- package/dist/core/mcp/tools/index.d.ts.map +1 -1
- package/dist/core/mcp/tools/index.js +161 -58
- package/dist/core/mcp/tools/index.js.map +1 -1
- package/dist/core/mcp/tools/sessions.d.ts +145 -0
- package/dist/core/mcp/tools/sessions.d.ts.map +1 -0
- package/dist/core/mcp/tools/sessions.js +226 -0
- package/dist/core/mcp/tools/sessions.js.map +1 -0
- package/dist/core/notes/list.d.ts.map +1 -1
- package/dist/core/notes/list.js +5 -0
- package/dist/core/notes/list.js.map +1 -1
- package/dist/core/plugin/build.d.ts +70 -0
- package/dist/core/plugin/build.d.ts.map +1 -0
- package/dist/core/plugin/build.js +159 -0
- package/dist/core/plugin/build.js.map +1 -0
- package/dist/core/plugin/routes.d.ts +35 -0
- package/dist/core/plugin/routes.d.ts.map +1 -0
- package/dist/core/plugin/routes.js +77 -0
- package/dist/core/plugin/routes.js.map +1 -0
- package/dist/core/plugin/zip.d.ts +17 -0
- package/dist/core/plugin/zip.d.ts.map +1 -0
- package/dist/core/plugin/zip.js +75 -0
- package/dist/core/plugin/zip.js.map +1 -0
- package/dist/core/reconcile.d.ts.map +1 -1
- package/dist/core/reconcile.js +2 -1
- package/dist/core/reconcile.js.map +1 -1
- package/dist/core/retrieval/pass.d.ts.map +1 -1
- package/dist/core/retrieval/pass.js +5 -4
- package/dist/core/retrieval/pass.js.map +1 -1
- package/dist/core/rollup.d.ts.map +1 -1
- package/dist/core/rollup.js +2 -3
- package/dist/core/rollup.js.map +1 -1
- package/dist/core/root.d.ts.map +1 -1
- package/dist/core/root.js +33 -2
- package/dist/core/root.js.map +1 -1
- package/dist/core/second-opinion/environment.d.ts +21 -0
- package/dist/core/second-opinion/environment.d.ts.map +1 -0
- package/dist/core/second-opinion/environment.js +70 -0
- package/dist/core/second-opinion/environment.js.map +1 -0
- package/dist/core/second-opinion/judge.d.ts +29 -0
- package/dist/core/second-opinion/judge.d.ts.map +1 -0
- package/dist/core/second-opinion/judge.js +55 -0
- package/dist/core/second-opinion/judge.js.map +1 -0
- package/dist/core/second-opinion/launch.d.ts +16 -0
- package/dist/core/second-opinion/launch.d.ts.map +1 -0
- package/dist/core/second-opinion/launch.js +75 -0
- package/dist/core/second-opinion/launch.js.map +1 -0
- package/dist/core/second-opinion/lineup.d.ts +82 -0
- package/dist/core/second-opinion/lineup.d.ts.map +1 -0
- package/dist/core/second-opinion/lineup.js +113 -0
- package/dist/core/second-opinion/lineup.js.map +1 -0
- package/dist/core/second-opinion/modes.d.ts +98 -0
- package/dist/core/second-opinion/modes.d.ts.map +1 -0
- package/dist/core/second-opinion/modes.js +224 -0
- package/dist/core/second-opinion/modes.js.map +1 -0
- package/dist/core/second-opinion/prompts.d.ts +18 -0
- package/dist/core/second-opinion/prompts.d.ts.map +1 -0
- package/dist/core/second-opinion/prompts.js +65 -0
- package/dist/core/second-opinion/prompts.js.map +1 -0
- package/dist/core/session/commit.d.ts +29 -0
- package/dist/core/session/commit.d.ts.map +1 -0
- package/dist/core/session/commit.js +22 -0
- package/dist/core/session/commit.js.map +1 -0
- package/dist/core/session/discard.d.ts +24 -0
- package/dist/core/session/discard.d.ts.map +1 -0
- package/dist/core/session/discard.js +68 -0
- package/dist/core/session/discard.js.map +1 -0
- package/dist/core/session/list.d.ts +48 -0
- package/dist/core/session/list.d.ts.map +1 -0
- package/dist/core/session/list.js +55 -0
- package/dist/core/session/list.js.map +1 -0
- package/dist/core/session/rebase.d.ts +34 -0
- package/dist/core/session/rebase.d.ts.map +1 -0
- package/dist/core/session/rebase.js +87 -0
- package/dist/core/session/rebase.js.map +1 -0
- package/dist/core/session/remote.d.ts +80 -0
- package/dist/core/session/remote.d.ts.map +1 -0
- package/dist/core/session/remote.js +102 -0
- package/dist/core/session/remote.js.map +1 -0
- package/dist/core/session/resolve.d.ts +41 -0
- package/dist/core/session/resolve.d.ts.map +1 -0
- package/dist/core/session/resolve.js +109 -0
- package/dist/core/session/resolve.js.map +1 -0
- package/dist/core/session/start.d.ts +46 -0
- package/dist/core/session/start.d.ts.map +1 -0
- package/dist/core/session/start.js +33 -0
- package/dist/core/session/start.js.map +1 -0
- package/dist/core/session/status.d.ts +47 -0
- package/dist/core/session/status.d.ts.map +1 -0
- package/dist/core/session/status.js +55 -0
- package/dist/core/session/status.js.map +1 -0
- package/dist/core/session/submit.d.ts +67 -0
- package/dist/core/session/submit.d.ts.map +1 -0
- package/dist/core/session/submit.js +254 -0
- package/dist/core/session/submit.js.map +1 -0
- package/dist/core/shared-stores-location.d.ts +17 -0
- package/dist/core/shared-stores-location.d.ts.map +1 -0
- package/dist/core/shared-stores-location.js +22 -0
- package/dist/core/shared-stores-location.js.map +1 -0
- package/dist/core/shared-stores.d.ts +69 -0
- package/dist/core/shared-stores.d.ts.map +1 -0
- package/dist/core/shared-stores.js +100 -0
- package/dist/core/shared-stores.js.map +1 -0
- package/dist/core/skills.d.ts +20 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +70 -13
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts +12 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +194 -55
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/templates/agents/shared-stores.md +11 -0
- package/templates/approve/copies-missing.md +1 -0
- package/templates/approve/elsewhere-heading.md +1 -0
- package/templates/approve/elsewhere-intro.md +1 -0
- package/templates/approve/homed-elsewhere.md +1 -0
- package/templates/approve/not-decider.md +1 -0
- package/templates/approve/part-heading.md +1 -0
- package/templates/approve/parts-changed.md +1 -0
- package/templates/approve/session-decision-note.md +1 -0
- package/templates/approve/session-intro.md +1 -0
- package/templates/approve/session-no-decision.md +1 -0
- package/templates/approve/store-unreachable.md +1 -0
- package/templates/land/resolver.md +2 -0
- package/templates/mcp/Delete.md +6 -0
- package/templates/mcp/Edit.md +6 -5
- package/templates/mcp/Glob.md +2 -2
- package/templates/mcp/Grep.md +2 -1
- package/templates/mcp/Move.md +7 -0
- package/templates/mcp/Read.md +4 -4
- package/templates/mcp/Write.md +4 -4
- package/templates/mcp/ctxr.md +7 -0
- package/templates/mcp/ctxr_write.md +8 -0
- package/templates/mcp/server-instructions.md +11 -3
- package/templates/mcp/session_discard.md +4 -0
- package/templates/mcp/session_list.md +7 -0
- package/templates/mcp/session_rebase.md +5 -0
- package/templates/mcp/session_start.md +7 -0
- package/templates/mcp/session_status.md +3 -0
- package/templates/mcp/session_submit.md +8 -0
- package/templates/plugin/README.md +13 -0
- package/templates/plugin/chatgpt-mcp.json +19 -0
- package/templates/plugin/chatgpt-plugin.json +13 -0
- package/templates/plugin/claude-mcp.json +8 -0
- package/templates/plugin/claude-plugin.json +6 -0
- package/templates/plugin/page.html +47 -0
- package/templates/second-opinion/poll-answer.md +7 -0
- package/templates/second-opinion/taste-panel.md +14 -0
- package/templates/session/pages/bare-route.md +2 -0
- package/templates/session/pages/block.md +8 -0
- package/templates/session/pages/condition-preview.md +1 -0
- package/templates/session/pages/condition.md +1 -0
- package/templates/session/pages/moved.md +1 -0
- package/templates/session/pages/stops-working.md +1 -0
- package/templates/session/pages/table-head-preview.md +2 -0
- package/templates/session/pages/table-head.md +2 -0
- package/templates/skills/ctxr-connection-finding.md +4 -1
- package/templates/skills/ctxr-land.md +26 -7
- package/templates/skills/ctxr-placement.md +10 -0
- package/templates/skills/ctxr-publish.md +2 -1
- package/templates/skills/ctxr-rollup.md +3 -0
- package/templates/skills/ctxr-second-opinion.md +52 -36
- package/templates/skills/ctxr-session-lifecycle.md +60 -33
- package/templates/skills/ctxr-submit.md +65 -56
- package/templates/skills/mcp/_preamble.md +44 -0
- package/dist/core/mcp/drafts.d.ts +0 -30
- package/dist/core/mcp/drafts.d.ts.map +0 -1
- package/dist/core/mcp/drafts.js +0 -52
- package/dist/core/mcp/drafts.js.map +0 -1
- package/templates/skills/ctxr-second-opinion/run.mjs +0 -542
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/critic-contract.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/lenses.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/architect.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/pragmatist.md +0 -0
- /package/templates/{skills/ctxr-second-opinion → second-opinion}/personas/skeptic.md +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { StoreConfig } from '../../config/schema.js';
|
|
2
|
+
import { type ForgeCredentials } from '../forge/credentials.js';
|
|
3
|
+
import type { GitRunner } from '../git/exec.js';
|
|
4
|
+
import { type SessionRef, type WorkingChange } from './resolve.js';
|
|
5
|
+
/**
|
|
6
|
+
* write-lifecycle spec (*`ctxr session status` re-scans a session*): the
|
|
7
|
+
* re-scan the submit and lifecycle skills ran as six git commands, in one
|
|
8
|
+
* call both surfaces share (bring-the-session-lifecycle-into-the-cli D3).
|
|
9
|
+
*/
|
|
10
|
+
export interface SessionStatus {
|
|
11
|
+
session: string;
|
|
12
|
+
worktree: string;
|
|
13
|
+
branch: string;
|
|
14
|
+
head: string;
|
|
15
|
+
/** What "ahead" is measured against: `origin/<default>` when this clone has it, else the local default branch. */
|
|
16
|
+
base: string;
|
|
17
|
+
/** Whether the default branch was fetched first; false offline or with no remote. */
|
|
18
|
+
fetched: boolean;
|
|
19
|
+
uncommitted: WorkingChange[];
|
|
20
|
+
diff_stat: {
|
|
21
|
+
committed: string;
|
|
22
|
+
uncommitted: string;
|
|
23
|
+
};
|
|
24
|
+
ahead: number;
|
|
25
|
+
commits: {
|
|
26
|
+
sha: string;
|
|
27
|
+
subject: string;
|
|
28
|
+
}[];
|
|
29
|
+
rebase_in_progress: boolean;
|
|
30
|
+
/** `--diff` only: the unified diff of uncommitted work, untracked files included. */
|
|
31
|
+
diff: string | null;
|
|
32
|
+
}
|
|
33
|
+
export interface StatusDeps {
|
|
34
|
+
git: GitRunner;
|
|
35
|
+
config: StoreConfig;
|
|
36
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
37
|
+
/** Fetches the default branch first when given; the re-scan then measures against what the remote has now. */
|
|
38
|
+
credentials?: ForgeCredentials;
|
|
39
|
+
}
|
|
40
|
+
/** Fetches the default branch into its remote-tracking ref; false when there is no remote or it cannot be reached. */
|
|
41
|
+
export declare function fetchDefaultBranch(deps: StatusDeps & {
|
|
42
|
+
credentials: ForgeCredentials;
|
|
43
|
+
}, cwd: string): Promise<boolean>;
|
|
44
|
+
export declare function sessionStatus(deps: StatusDeps, session: SessionRef, opts?: {
|
|
45
|
+
diff?: boolean;
|
|
46
|
+
}): Promise<SessionStatus>;
|
|
47
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/core/session/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAkD,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEnH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,kHAAkH;IAClH,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,SAAS,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qFAAqF;IACrF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,8GAA8G;IAC9G,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,sHAAsH;AACtH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,WAAW,EAAE,gBAAgB,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK5H;AAOD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAsChI"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { baseRef } from '../approval/sessions.js';
|
|
2
|
+
import { runRemoteGit } from '../forge/credentials.js';
|
|
3
|
+
import { hasRemote } from '../git/worktree.js';
|
|
4
|
+
import { commitsAhead, rebaseInProgress, workingChanges } from './resolve.js';
|
|
5
|
+
/** Fetches the default branch into its remote-tracking ref; false when there is no remote or it cannot be reached. */
|
|
6
|
+
export async function fetchDefaultBranch(deps, cwd) {
|
|
7
|
+
if (!(await hasRemote(deps.git, cwd)))
|
|
8
|
+
return false;
|
|
9
|
+
const branch = deps.config.git.default_branch;
|
|
10
|
+
const fetched = await runRemoteGit(deps.git, deps.credentials, deps.env, ['fetch', '--quiet', 'origin', `+refs/heads/${branch}:refs/remotes/origin/${branch}`], { cwd, allowFailure: true });
|
|
11
|
+
return fetched.exitCode === 0;
|
|
12
|
+
}
|
|
13
|
+
async function untrackedDiff(git, cwd, file) {
|
|
14
|
+
// `--no-index` exits 1 when the files differ, which for a new file they always do.
|
|
15
|
+
return (await git.run(['diff', '--no-index', '--', '/dev/null', file], { cwd, allowFailure: true })).stdout;
|
|
16
|
+
}
|
|
17
|
+
export async function sessionStatus(deps, session, opts = {}) {
|
|
18
|
+
const run = async (args) => (await deps.git.run(args, { cwd: session.path, allowFailure: true })).stdout;
|
|
19
|
+
const fetched = deps.credentials === undefined ? false : await fetchDefaultBranch({ ...deps, credentials: deps.credentials }, session.path);
|
|
20
|
+
const base = await baseRef(deps.git, session.path, deps.config.git.default_branch);
|
|
21
|
+
const uncommitted = await workingChanges(deps.git, session.path);
|
|
22
|
+
const log = await run(['log', '--format=%H%x09%s', `${base}..HEAD`]);
|
|
23
|
+
const commits = log
|
|
24
|
+
.split('\n')
|
|
25
|
+
.filter((line) => line !== '')
|
|
26
|
+
.map((line) => {
|
|
27
|
+
const [sha, ...subject] = line.split('\t');
|
|
28
|
+
return { sha: sha, subject: subject.join('\t') };
|
|
29
|
+
});
|
|
30
|
+
let diff = null;
|
|
31
|
+
if (opts.diff === true) {
|
|
32
|
+
const parts = [await run(['diff', 'HEAD'])];
|
|
33
|
+
for (const change of uncommitted.filter((c) => c.status === '??'))
|
|
34
|
+
parts.push(await untrackedDiff(deps.git, session.path, change.path));
|
|
35
|
+
diff = parts.filter((part) => part !== '').join('');
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
session: session.name,
|
|
39
|
+
worktree: session.path,
|
|
40
|
+
branch: session.branch,
|
|
41
|
+
head: (await run(['rev-parse', 'HEAD'])).trim(),
|
|
42
|
+
base,
|
|
43
|
+
fetched,
|
|
44
|
+
uncommitted,
|
|
45
|
+
diff_stat: {
|
|
46
|
+
committed: (await run(['diff', '--stat', `${base}...HEAD`])).replace(/\n$/, ''),
|
|
47
|
+
uncommitted: (await run(['diff', '--stat', 'HEAD'])).replace(/\n$/, ''),
|
|
48
|
+
},
|
|
49
|
+
ahead: await commitsAhead(deps.git, session.path, base),
|
|
50
|
+
commits,
|
|
51
|
+
rebase_in_progress: await rebaseInProgress(deps.git, session.path),
|
|
52
|
+
diff,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/core/session/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type PageUrlEntry } from '../../commands/publish-urls.js';
|
|
2
|
+
import { type SessionIdentity } from '../approval/session-marker.js';
|
|
3
|
+
import type { Store } from '../store.js';
|
|
4
|
+
import { type CommitOptions } from './commit.js';
|
|
5
|
+
import { type PushOutcome, type RemoteDeps } from './remote.js';
|
|
6
|
+
import { type SessionRef } from './resolve.js';
|
|
7
|
+
/**
|
|
8
|
+
* write-lifecycle spec (*`ctxr session submit` gates, commits, pushes and
|
|
9
|
+
* opens the pull request*): the mechanical steps of `ctxr-submit` in one call,
|
|
10
|
+
* shared by the CLI and the MCP surface (bring-the-session-lifecycle-into-the-cli
|
|
11
|
+
* D1–D4). The gate is the same store-scope pass `ctxr doctor` runs; the
|
|
12
|
+
* pre-commit and pre-push hooks stay the commit and default-branch gates.
|
|
13
|
+
*
|
|
14
|
+
* Each step leaves what it did in place when a later one fails, and every
|
|
15
|
+
* remote step reads before it writes, so running the same submit again
|
|
16
|
+
* finishes the job without a second commit or pull request.
|
|
17
|
+
*/
|
|
18
|
+
export interface SubmitInput {
|
|
19
|
+
branch: string;
|
|
20
|
+
message: string;
|
|
21
|
+
title: string;
|
|
22
|
+
/** The agent's own body: why, what changed, route, verification, follow-ups. */
|
|
23
|
+
body: string;
|
|
24
|
+
}
|
|
25
|
+
export type SubmitStep = 'arguments' | 'staged' | 'gate' | 'commit' | 'branch' | 'push' | 'pull_request';
|
|
26
|
+
export interface SubmitSteps {
|
|
27
|
+
/** The paths in the index when the gate ran, relative to the worktree's top level. */
|
|
28
|
+
staged: string[];
|
|
29
|
+
gate: 'pass';
|
|
30
|
+
/** The new commit, or null when nothing was left to commit (a retry, or work already committed). */
|
|
31
|
+
commit: string | null;
|
|
32
|
+
branch: 'renamed' | 'kept';
|
|
33
|
+
push: PushOutcome;
|
|
34
|
+
pull_request: 'created' | 'updated' | 'found';
|
|
35
|
+
}
|
|
36
|
+
export interface SubmitResult {
|
|
37
|
+
session: string;
|
|
38
|
+
worktree: string;
|
|
39
|
+
branch: string;
|
|
40
|
+
/** The generated name the branch carried before this submit renamed it; null when it was kept. */
|
|
41
|
+
renamed_from: string | null;
|
|
42
|
+
head: string;
|
|
43
|
+
steps: SubmitSteps;
|
|
44
|
+
pull_request: {
|
|
45
|
+
number: number;
|
|
46
|
+
url: string;
|
|
47
|
+
};
|
|
48
|
+
/** The approval page for the session, when the store declares change approval. */
|
|
49
|
+
/** The session the pull request belongs to, as its marker names it; null when the store has no `origin` to name it by. */
|
|
50
|
+
session_identity: SessionIdentity | null;
|
|
51
|
+
approval_url: string | null;
|
|
52
|
+
}
|
|
53
|
+
export interface SubmitDeps extends RemoteDeps {
|
|
54
|
+
/** D4: the MCP surface's member identity; omitted, the clone's own identity commits. */
|
|
55
|
+
commit?: Omit<CommitOptions, 'message'>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The Pages section, built from `ctxr publish urls`' report for the range —
|
|
59
|
+
* every value copied from it, never rebuilt from a path — or null when the
|
|
60
|
+
* report lists no page. The sentences are `templates/session/pages/`'s.
|
|
61
|
+
*/
|
|
62
|
+
export declare function renderPagesSection(pages: readonly PageUrlEntry[], base: string, baseUrlDeclared: boolean): string | null;
|
|
63
|
+
export declare function approvalAddress(config: Store['config'], name: string): string | null;
|
|
64
|
+
export declare function submitSession(deps: SubmitDeps, session: SessionRef, input: SubmitInput): Promise<SubmitResult>;
|
|
65
|
+
/** `--body-file`: the body read from a file, relative to `cwd`. */
|
|
66
|
+
export declare function readBodyFile(cwd: string, file: string): Promise<string>;
|
|
67
|
+
//# sourceMappingURL=submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../../src/core/session/submit.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAElG,OAAO,EAA0F,KAAK,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAO7J,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAA6D,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC;AAEzG,MAAM,WAAW,WAAW;IAC1B,sFAAsF;IACtF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kGAAkG;IAClG,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,kFAAkF;IAClF,0HAA0H;IAC1H,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,UAAW,SAAQ,UAAU;IAC5C,wFAAwF;IACxF,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;CACzC;AA2CD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAexH;AA2BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpF;AAmCD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA+GpH;AAED,mEAAmE;AACnE,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM7E"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { readConfig } from '../../config/load.js';
|
|
4
|
+
import { MIGRATION_STEPS } from '../../config/migrations.js';
|
|
5
|
+
import * as doctorCommand from '../../commands/doctor.js';
|
|
6
|
+
import * as graphDiffCommand from '../../commands/graph-diff.js';
|
|
7
|
+
import { pageUrlsFor } from '../../commands/publish-urls.js';
|
|
8
|
+
import { baseRef } from '../approval/sessions.js';
|
|
9
|
+
import { findSessionMarker, identityOfWorktree, repositorySlug, sessionMarker, sessionRouteName } from '../approval/session-marker.js';
|
|
10
|
+
import { mountingStoreOf } from '../shared-stores.js';
|
|
11
|
+
import { ForgeRequestError } from '../forge/github.js';
|
|
12
|
+
import { ContextureError, SessionRefusedError } from '../errors.js';
|
|
13
|
+
import { ExitCode } from '../exit-codes.js';
|
|
14
|
+
import { hasRemote } from '../git/worktree.js';
|
|
15
|
+
import { packagedTemplate, substituteBlock } from '../templates.js';
|
|
16
|
+
import { commitStaged } from './commit.js';
|
|
17
|
+
import { firstLines, publishSession, remoteTip, SessionRemoteError } from './remote.js';
|
|
18
|
+
import { commitsAhead, rebaseInProgress } from './resolve.js';
|
|
19
|
+
/** A submit that stopped at a step; `details.step` names it and `details.completed` what ran before it. */
|
|
20
|
+
function stopped(exitCode, reason, step, completed, message, details = {}) {
|
|
21
|
+
return new SessionRefusedError(exitCode, reason, message, { step, completed, ...details });
|
|
22
|
+
}
|
|
23
|
+
/** The generated sections' headings, as the templates that write them spell them. */
|
|
24
|
+
function generatedHeadings() {
|
|
25
|
+
return [packagedTemplate('graph/knowledge-changes', 'block'), packagedTemplate('session/pages', 'block')].map((block) => block.split('\n')[0].replace(/^#+\s*/, ''));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* D2: the generated sections are the command's, so a body that already
|
|
29
|
+
* carries either heading — as a markdown heading or a bold line — is refused
|
|
30
|
+
* rather than appended to, and the section can be neither duplicated nor
|
|
31
|
+
* hand-edited.
|
|
32
|
+
*/
|
|
33
|
+
function headingInBody(body) {
|
|
34
|
+
for (const heading of generatedHeadings()) {
|
|
35
|
+
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
36
|
+
if (new RegExp(`^\\s*(?:#{1,6}\\s+|\\*\\*)${escaped}(?:\\*\\*)?\\s*:?\\s*$`, 'im').test(body))
|
|
37
|
+
return heading;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
function under(file, prefix) {
|
|
42
|
+
const normalized = prefix.endsWith('/') ? prefix : `${prefix}/`;
|
|
43
|
+
return file.startsWith(normalized);
|
|
44
|
+
}
|
|
45
|
+
async function openWorktreeStore(session) {
|
|
46
|
+
return { root: session.storeRoot, config: await readConfig(session.storeRoot, MIGRATION_STEPS) };
|
|
47
|
+
}
|
|
48
|
+
function show(address) {
|
|
49
|
+
return `\`${address.url ?? address.route}\``;
|
|
50
|
+
}
|
|
51
|
+
function fill(text, values) {
|
|
52
|
+
return Object.entries(values).reduce((out, [token, value]) => out.replaceAll(`__${token}__`, () => value), text);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The Pages section, built from `ctxr publish urls`' report for the range —
|
|
56
|
+
* every value copied from it, never rebuilt from a path — or null when the
|
|
57
|
+
* report lists no page. The sentences are `templates/session/pages/`'s.
|
|
58
|
+
*/
|
|
59
|
+
export function renderPagesSection(pages, base, baseUrlDeclared) {
|
|
60
|
+
if (pages.length === 0)
|
|
61
|
+
return null;
|
|
62
|
+
const template = (name) => packagedTemplate('session/pages', name);
|
|
63
|
+
const previews = pages.some((p) => p.preview !== null);
|
|
64
|
+
const rows = pages.map((page) => {
|
|
65
|
+
let published = page.status === 'removed' ? fill(template('stops-working'), { ADDRESS: show(page.published) }) : show(page.published);
|
|
66
|
+
if (page.moved_from !== null)
|
|
67
|
+
published = fill(template('moved'), { ADDRESS: published, PATH: page.moved_from.path, OLD: show(page.moved_from.published) });
|
|
68
|
+
const cells = [`\`${page.path}\``, page.status, page.lifespan, ...(previews ? [page.preview === null ? '' : show(page.preview)] : []), published];
|
|
69
|
+
return `| ${cells.join(' | ')} |`;
|
|
70
|
+
});
|
|
71
|
+
let text = template('block').replaceAll('__BASE__', () => base);
|
|
72
|
+
text = substituteBlock(text, '__TABLE__', [...template(previews ? 'table-head-preview' : 'table-head').split('\n'), ...rows]);
|
|
73
|
+
text = substituteBlock(text, '__CONDITION__', template(previews ? 'condition-preview' : 'condition').split('\n'));
|
|
74
|
+
text = substituteBlock(text, '__BARE_ROUTE__', baseUrlDeclared ? [] : template('bare-route').split('\n'));
|
|
75
|
+
return text;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* D2: the body the pull request carries — the agent's, then the Pages section when there is one, then the Knowledge
|
|
79
|
+
* changes block verbatim, then (approve-sessions-across-stores) the session marker, last, when the session has an
|
|
80
|
+
* identity.
|
|
81
|
+
*/
|
|
82
|
+
async function pullBody(session, base, body, identity) {
|
|
83
|
+
const store = await openWorktreeStore(session);
|
|
84
|
+
const knowledge = (await graphDiffCommand.execute(store, { since: base, until: undefined, format: 'markdown' })).humanSummary;
|
|
85
|
+
const pages = renderPagesSection(await pageUrlsFor(store, [`${base}...HEAD`]), base, store.config.serve?.base_url !== undefined);
|
|
86
|
+
return [body.trim(), ...(pages === null ? [] : [pages]), knowledge, ...(identity === null ? [] : [sessionMarker(identity)])].join('\n\n');
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The approval page for the session: the home store's, by the home session's name, for a session joined from a
|
|
90
|
+
* mount (approve-sessions-across-stores); otherwise this store's, by the worktree's name.
|
|
91
|
+
*/
|
|
92
|
+
async function sessionApprovalAddress(deps, session, identity) {
|
|
93
|
+
if (identity !== null) {
|
|
94
|
+
const mounting = await mountingStoreOf(session.path);
|
|
95
|
+
const ownSlug = await repositorySlug(deps.git, session.path);
|
|
96
|
+
if (mounting !== null && identity.home !== ownSlug)
|
|
97
|
+
return approvalAddress(mounting.config, sessionRouteName(identity));
|
|
98
|
+
}
|
|
99
|
+
return approvalAddress(deps.config, session.name);
|
|
100
|
+
}
|
|
101
|
+
export function approvalAddress(config, name) {
|
|
102
|
+
if (config.change_approval === undefined)
|
|
103
|
+
return null;
|
|
104
|
+
const route = `/approve/${encodeURIComponent(name)}/`;
|
|
105
|
+
const baseUrl = config.serve?.base_url;
|
|
106
|
+
return baseUrl === undefined ? route : `${baseUrl.replace(/\/+$/, '')}${route}`;
|
|
107
|
+
}
|
|
108
|
+
async function checkBranchName(deps, session, wanted) {
|
|
109
|
+
const { git } = deps;
|
|
110
|
+
const refuse = (reason, message) => stopped(ExitCode.Usage, reason, 'arguments', {}, message, { branch: wanted });
|
|
111
|
+
const format = await git.run(['check-ref-format', '--branch', wanted], { cwd: session.path, allowFailure: true });
|
|
112
|
+
if (format.exitCode !== 0 || wanted.startsWith('-'))
|
|
113
|
+
throw refuse('branch_invalid', `"${wanted}" is not a usable branch name.`);
|
|
114
|
+
if (wanted === deps.config.git.default_branch)
|
|
115
|
+
throw refuse('branch_is_default', `"${wanted}" is the default branch; a session is never pushed to it.`);
|
|
116
|
+
if (wanted === session.branch)
|
|
117
|
+
return;
|
|
118
|
+
const local = await git.run(['rev-parse', '--verify', '--quiet', `refs/heads/${wanted}`], { cwd: session.path, allowFailure: true });
|
|
119
|
+
if (local.exitCode === 0)
|
|
120
|
+
throw refuse('branch_taken', `A branch named "${wanted}" already exists in this repository; give this session another name.`);
|
|
121
|
+
if (await hasRemote(git, session.path)) {
|
|
122
|
+
let onRemote = null;
|
|
123
|
+
try {
|
|
124
|
+
onRemote = await remoteTip(deps, session.path, wanted);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
if (!(err instanceof SessionRemoteError))
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
if (onRemote !== null)
|
|
131
|
+
throw refuse('branch_taken', `The remote already has a branch named "${wanted}"; give this session another name.`);
|
|
132
|
+
}
|
|
133
|
+
// Renaming a branch whose pull request is open would strand that pull request and open a second one.
|
|
134
|
+
let pulls;
|
|
135
|
+
try {
|
|
136
|
+
pulls = await deps.forge.pullsForHead(session.branch);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (!(err instanceof ForgeRequestError))
|
|
140
|
+
throw err;
|
|
141
|
+
throw stopped(ExitCode.CheckFailed, 'forge_unreachable', 'arguments', {}, `The forge could not be read to check "${session.branch}" for an open pull request before renaming it (${firstLines(err.message, 2)}); nothing was done.`);
|
|
142
|
+
}
|
|
143
|
+
const open = pulls.find((p) => p.state === 'open');
|
|
144
|
+
if (open !== undefined) {
|
|
145
|
+
throw refuse('branch_has_pull_request', `"${session.name}" already has pull request #${open.number} open on branch "${session.branch}"; submit it again with --branch "${session.branch}".`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export async function submitSession(deps, session, input) {
|
|
149
|
+
const { git } = deps;
|
|
150
|
+
const cwd = session.path;
|
|
151
|
+
const run = (args) => git.run(args, { cwd, allowFailure: true });
|
|
152
|
+
for (const [name, value] of [['--message', input.message], ['--title', input.title], ['--body', input.body]]) {
|
|
153
|
+
if (value.trim() === '')
|
|
154
|
+
throw stopped(ExitCode.Usage, 'argument_empty', 'arguments', {}, `${name} cannot be empty.`);
|
|
155
|
+
}
|
|
156
|
+
// approve-sessions-across-stores: only the command writes the session marker, so an agent's body cannot claim a session.
|
|
157
|
+
const claimed = findSessionMarker(input.body);
|
|
158
|
+
if (claimed !== null) {
|
|
159
|
+
throw stopped(ExitCode.Usage, 'body_has_session_marker', 'arguments', {}, `The body carries a session marker (${claimed}), which \`ctxr session submit\` writes itself; leave it out of the body.`, { marker: claimed });
|
|
160
|
+
}
|
|
161
|
+
const heading = headingInBody(input.body);
|
|
162
|
+
if (heading !== null) {
|
|
163
|
+
throw stopped(ExitCode.Usage, 'body_has_generated_section', 'arguments', {}, `The body carries a "${heading}" section, which \`ctxr session submit\` writes itself; leave it out of the body.`, { heading });
|
|
164
|
+
}
|
|
165
|
+
if (await rebaseInProgress(git, cwd)) {
|
|
166
|
+
throw stopped(ExitCode.CheckFailed, 'rebase_in_progress', 'arguments', {}, `A rebase is in progress in "${session.name}"; finish it with \`ctxr session rebase ${session.name} --continue\` or undo it with \`ctxr session rebase ${session.name} --abort\`.`);
|
|
167
|
+
}
|
|
168
|
+
await checkBranchName(deps, session, input.branch);
|
|
169
|
+
// Read before any rename: a session started on a generated or joined branch keeps that identity after it is renamed.
|
|
170
|
+
const identity = await identityOfWorktree(git, deps.config, session.path, session.name, session.branch);
|
|
171
|
+
// Revision 2: the whole index, whoever staged it, is checked before anything is staged, so a refusal leaves it as it was.
|
|
172
|
+
const prefix = (await git.run(['rev-parse', '--show-prefix'], { cwd: session.storeRoot })).stdout.trim();
|
|
173
|
+
const derived = deps.config.derived.paths.map((p) => `${prefix}${p}`);
|
|
174
|
+
const indexed = (await run(['diff', '--cached', '--name-status', '--no-renames', '-z'])).stdout.split('\0');
|
|
175
|
+
const derivedStaged = [];
|
|
176
|
+
for (let i = 0; i + 1 < indexed.length; i += 2) {
|
|
177
|
+
if (indexed[i] !== 'D' && derived.some((d) => under(indexed[i + 1], d)))
|
|
178
|
+
derivedStaged.push(indexed[i + 1]);
|
|
179
|
+
}
|
|
180
|
+
if (derivedStaged.length > 0) {
|
|
181
|
+
throw stopped(ExitCode.CheckFailed, 'derived_path_staged', 'staged', {}, `${derivedStaged.map((p) => `"${p}"`).join(', ')} ${derivedStaged.length === 1 ? 'is' : 'are'} staged under a derived path, which is never committed; unstage ${derivedStaged.length === 1 ? 'it' : 'them'} with \`git restore --staged\` and submit again.`, { paths: derivedStaged });
|
|
182
|
+
}
|
|
183
|
+
const added = await run(['add', '-A', '--', ':/', ...derived.map((d) => `:(top,exclude)${d}`)]);
|
|
184
|
+
if (added.exitCode !== 0)
|
|
185
|
+
throw stopped(ExitCode.CheckFailed, 'stage_failed', 'staged', {}, `The session's changes could not be staged: ${added.stderr.trim()}`);
|
|
186
|
+
const staged = (await run(['diff', '--cached', '--name-only', '-z'])).stdout.split('\0').filter((p) => p !== '');
|
|
187
|
+
const completed = { staged };
|
|
188
|
+
const base = await baseRef(git, cwd, deps.config.git.default_branch);
|
|
189
|
+
if (staged.length === 0 && (await commitsAhead(git, cwd, base)) === 0) {
|
|
190
|
+
throw stopped(ExitCode.CheckFailed, 'nothing_to_submit', 'staged', completed, `"${session.name}" has no changes and no commits ahead of ${base}, so there is nothing to submit.`);
|
|
191
|
+
}
|
|
192
|
+
// D1, point 2: the gate is doctor's own store-scope pass, run against the worktree — no second validator.
|
|
193
|
+
// A store doctor cannot even read (a note with unparseable frontmatter) fails the gate as well.
|
|
194
|
+
const doctor = await openWorktreeStore(session)
|
|
195
|
+
.then((store) => doctorCommand.execute({ git }, store))
|
|
196
|
+
.catch((err) => {
|
|
197
|
+
if (err instanceof ContextureError)
|
|
198
|
+
return { exitCode: err.exitCode, findings: [err.finding] };
|
|
199
|
+
throw err;
|
|
200
|
+
});
|
|
201
|
+
if (doctor.exitCode !== ExitCode.Ok) {
|
|
202
|
+
const errors = doctor.findings.filter((f) => f.severity === 'error');
|
|
203
|
+
const listed = errors.slice(0, 5).map((f) => `${f.code}: ${f.message}`).join('; ');
|
|
204
|
+
throw stopped(ExitCode.CheckFailed, 'gate_failed', 'gate', completed, `\`ctxr doctor\` fails in "${session.name}", so nothing was committed: ${listed}${errors.length > 5 ? ` (and ${errors.length - 5} more)` : ''}`, { findings: errors });
|
|
205
|
+
}
|
|
206
|
+
completed.gate = 'pass';
|
|
207
|
+
completed.commit = null;
|
|
208
|
+
if (staged.length > 0) {
|
|
209
|
+
const committed = await commitStaged(git, cwd, deps.env, { ...deps.commit, message: input.message });
|
|
210
|
+
if (committed.exitCode !== 0) {
|
|
211
|
+
throw stopped(ExitCode.CheckFailed, 'commit_refused', 'commit', completed, `The commit was refused: ${`${committed.stdout}\n${committed.stderr}`.trim()}`);
|
|
212
|
+
}
|
|
213
|
+
completed.commit = (await run(['rev-parse', 'HEAD'])).stdout.trim();
|
|
214
|
+
}
|
|
215
|
+
let renamedFrom = null;
|
|
216
|
+
if (input.branch !== session.branch) {
|
|
217
|
+
const renamed = await run(['branch', '-m', input.branch]);
|
|
218
|
+
if (renamed.exitCode !== 0)
|
|
219
|
+
throw stopped(ExitCode.CheckFailed, 'rename_failed', 'branch', completed, `The branch could not be renamed to "${input.branch}": ${renamed.stderr.trim()}`);
|
|
220
|
+
renamedFrom = session.branch;
|
|
221
|
+
}
|
|
222
|
+
completed.branch = renamedFrom === null ? 'kept' : 'renamed';
|
|
223
|
+
const target = { path: cwd, branch: input.branch };
|
|
224
|
+
let published;
|
|
225
|
+
try {
|
|
226
|
+
published = await publishSession(deps, target, { title: input.title, body: await pullBody(session, base, input.body, identity) }, { update: true });
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
if (!(err instanceof SessionRemoteError))
|
|
230
|
+
throw err;
|
|
231
|
+
throw stopped(ExitCode.CheckFailed, err.step === 'push' ? 'push_failed' : 'pull_request_failed', err.step, completed, `${err.step === 'push' ? `The branch "${input.branch}" could not be pushed` : 'The branch is pushed, but its pull request could not be opened or updated'} (${err.detail}). Everything before this step is in place; run the same submit again to finish.`);
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
session: session.name,
|
|
235
|
+
worktree: cwd,
|
|
236
|
+
branch: input.branch,
|
|
237
|
+
renamed_from: renamedFrom,
|
|
238
|
+
head: (await run(['rev-parse', 'HEAD'])).stdout.trim(),
|
|
239
|
+
steps: { staged, gate: 'pass', commit: completed.commit, branch: completed.branch, push: published.push, pull_request: published.pullRequest },
|
|
240
|
+
pull_request: { number: published.pull.number, url: published.pull.url },
|
|
241
|
+
session_identity: identity,
|
|
242
|
+
approval_url: await sessionApprovalAddress(deps, session, identity),
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** `--body-file`: the body read from a file, relative to `cwd`. */
|
|
246
|
+
export async function readBodyFile(cwd, file) {
|
|
247
|
+
try {
|
|
248
|
+
return await readFile(path.resolve(cwd, file), 'utf8');
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
throw stopped(ExitCode.Usage, 'body_file_unreadable', 'arguments', {}, `--body-file "${file}" cannot be read (${err.code ?? 'error'}).`, { file });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/core/session/submit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StoreConfig } from '../config/schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* mount-shared-stores: the fixed directory every mount sits under (D3, and the
|
|
4
|
+
* critique's first revision). Fixed rather than configurable because path links
|
|
5
|
+
* written into notes carry it, so it has to mean the same thing in every store.
|
|
6
|
+
*
|
|
7
|
+
* Kept apart from `shared-stores.ts` because note enumeration needs it, and
|
|
8
|
+
* `shared-stores.ts` itself enumerates notes.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SHARED_STORES_DIR = "shared";
|
|
11
|
+
/** A mount's store-relative location, `shared/<name>`. */
|
|
12
|
+
export declare function mountLocation(name: string): string;
|
|
13
|
+
/** Whether the store declares any mounts. A store with no `shared_stores` key behaves exactly as before. */
|
|
14
|
+
export declare function declaresSharedStores(config: StoreConfig): boolean;
|
|
15
|
+
/** Every declared mount's location: the owning-store scopes link resolution splits a read view by. */
|
|
16
|
+
export declare function mountScopes(config: StoreConfig): string[];
|
|
17
|
+
//# sourceMappingURL=shared-stores-location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-location.d.ts","sourceRoot":"","sources":["../../src/core/shared-stores-location.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEjE;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAEzD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mount-shared-stores: the fixed directory every mount sits under (D3, and the
|
|
3
|
+
* critique's first revision). Fixed rather than configurable because path links
|
|
4
|
+
* written into notes carry it, so it has to mean the same thing in every store.
|
|
5
|
+
*
|
|
6
|
+
* Kept apart from `shared-stores.ts` because note enumeration needs it, and
|
|
7
|
+
* `shared-stores.ts` itself enumerates notes.
|
|
8
|
+
*/
|
|
9
|
+
export const SHARED_STORES_DIR = 'shared';
|
|
10
|
+
/** A mount's store-relative location, `shared/<name>`. */
|
|
11
|
+
export function mountLocation(name) {
|
|
12
|
+
return `${SHARED_STORES_DIR}/${name}`;
|
|
13
|
+
}
|
|
14
|
+
/** Whether the store declares any mounts. A store with no `shared_stores` key behaves exactly as before. */
|
|
15
|
+
export function declaresSharedStores(config) {
|
|
16
|
+
return (config.shared_stores ?? []).length > 0;
|
|
17
|
+
}
|
|
18
|
+
/** Every declared mount's location: the owning-store scopes link resolution splits a read view by. */
|
|
19
|
+
export function mountScopes(config) {
|
|
20
|
+
return (config.shared_stores ?? []).map((mount) => mountLocation(mount.name));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=shared-stores-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores-location.js","sourceRoot":"","sources":["../../src/core/shared-stores-location.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,iBAAiB,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { StoreConfig } from '../config/schema.js';
|
|
2
|
+
import { type GraphBuildResult } from './graph/model.js';
|
|
3
|
+
import { type Note } from './notes/list.js';
|
|
4
|
+
export { mainWorkingTreeRoot } from './git/repo.js';
|
|
5
|
+
export { SHARED_STORES_DIR, declaresSharedStores, mountLocation, mountScopes } from './shared-stores-location.js';
|
|
6
|
+
export type MountState = {
|
|
7
|
+
name: string;
|
|
8
|
+
url: string;
|
|
9
|
+
location: string;
|
|
10
|
+
root: string;
|
|
11
|
+
state: 'present';
|
|
12
|
+
config: StoreConfig;
|
|
13
|
+
} | {
|
|
14
|
+
name: string;
|
|
15
|
+
url: string;
|
|
16
|
+
location: string;
|
|
17
|
+
root: string;
|
|
18
|
+
state: 'absent';
|
|
19
|
+
} | {
|
|
20
|
+
name: string;
|
|
21
|
+
url: string;
|
|
22
|
+
location: string;
|
|
23
|
+
root: string;
|
|
24
|
+
state: 'not_store';
|
|
25
|
+
reason: string;
|
|
26
|
+
};
|
|
27
|
+
/** Every declared mount and whether it can join the read view, read from the main working tree. */
|
|
28
|
+
export declare function resolveMounts(storeRoot: string, config: StoreConfig): Promise<MountState[]>;
|
|
29
|
+
export interface ReadView {
|
|
30
|
+
/** The store's own notes, then each present mount's, every mounted path prefixed by its location. */
|
|
31
|
+
notes: Note[];
|
|
32
|
+
/** The location prefix of every mount that contributed notes; link resolution scopes by these. */
|
|
33
|
+
scopes: string[];
|
|
34
|
+
mounts: MountState[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* context-retrieval (mount-shared-stores): the store's own notes plus each
|
|
38
|
+
* present mount's, each admitted by the configuration of the store that owns
|
|
39
|
+
* it (D5). A store with no mounts gets exactly its own notes and no scopes.
|
|
40
|
+
*/
|
|
41
|
+
export declare function listReadView(storeRoot: string, config: StoreConfig): Promise<ReadView>;
|
|
42
|
+
/** The graph of a store's read view: the one build every caller that writes or compares the persisted graph uses. */
|
|
43
|
+
export declare function buildReadViewGraph(storeRoot: string, config: StoreConfig): Promise<{
|
|
44
|
+
graph: GraphBuildResult;
|
|
45
|
+
view: ReadView;
|
|
46
|
+
}>;
|
|
47
|
+
export interface UnavailableMount {
|
|
48
|
+
name: string;
|
|
49
|
+
location: string;
|
|
50
|
+
state: 'absent' | 'not_store';
|
|
51
|
+
reason?: string;
|
|
52
|
+
}
|
|
53
|
+
/** Mounts a read view could not include, as report lines. */
|
|
54
|
+
export declare function unavailableMounts(mounts: readonly MountState[]): UnavailableMount[];
|
|
55
|
+
export interface MountingStore {
|
|
56
|
+
/** The main working tree of the store that declares this one as a mount. */
|
|
57
|
+
root: string;
|
|
58
|
+
config: StoreConfig;
|
|
59
|
+
/** The name it declares this store under. */
|
|
60
|
+
mountName: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* approve-sessions-across-stores: the store that mounts the store at
|
|
64
|
+
* `storeRoot`, when `storeRoot` is (or is a worktree of) a clone at
|
|
65
|
+
* `shared/<name>` of a store that declares a mount named `<name>`; null
|
|
66
|
+
* otherwise. Decided from the filesystem and that store's configuration alone.
|
|
67
|
+
*/
|
|
68
|
+
export declare function mountingStoreOf(storeRoot: string): Promise<MountingStore | null>;
|
|
69
|
+
//# sourceMappingURL=shared-stores.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-stores.d.ts","sourceRoot":"","sources":["../../src/core/shared-stores.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACpG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtG,mGAAmG;AACnG,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsBjG;AAED,MAAM,WAAW,QAAQ;IACvB,qGAAqG;IACrG,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,kGAAkG;IAClG,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAe5F;AAED,qHAAqH;AACrH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAGrI;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAOnF;AAED,MAAM,WAAW,aAAa;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAetF"}
|