berry-agent 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/.api-emit.stamp +1 -0
- package/dist/.build-meta.json +6 -0
- package/dist/agent/events.js +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/loop.js +139 -0
- package/dist/agent/queue.js +119 -0
- package/dist/agent/stream.js +62 -0
- package/dist/agent/tools-batch.js +221 -0
- package/dist/agent/types.js +8 -0
- package/dist/api/berry-agent-llm.d.ts +18 -0
- package/dist/api/berry-agent.d.ts +9 -0
- package/dist/api/surface.json +1632 -0
- package/dist/api/tsconfig.paths.json +12 -0
- package/dist/api/typebox-compile.d.ts +2 -0
- package/dist/api/typebox-value.d.ts +2 -0
- package/dist/api/typebox.d.ts +2 -0
- package/dist/browser/cdp.js +256 -0
- package/dist/browser/codes.js +31 -0
- package/dist/browser/discover.js +107 -0
- package/dist/browser/engine.js +169 -0
- package/dist/browser/index.js +17 -0
- package/dist/browser/install.js +342 -0
- package/dist/browser/page.js +321 -0
- package/dist/browser/service.js +158 -0
- package/dist/browser/tools.js +198 -0
- package/dist/browser/types.js +81 -0
- package/dist/channels/ask-queue.js +82 -0
- package/dist/channels/commands.js +129 -0
- package/dist/channels/engine/cell.js +143 -0
- package/dist/channels/engine/diff.js +143 -0
- package/dist/channels/engine/engine.js +416 -0
- package/dist/channels/engine/index.js +8 -0
- package/dist/channels/engine/input-keys.js +86 -0
- package/dist/channels/engine/input.js +596 -0
- package/dist/channels/engine/memory-io.js +71 -0
- package/dist/channels/engine/process-io.js +38 -0
- package/dist/channels/engine/types.js +17 -0
- package/dist/channels/engine/width.js +122 -0
- package/dist/channels/index.js +15 -0
- package/dist/channels/registry.js +56 -0
- package/dist/channels/sdk/admit.js +29 -0
- package/dist/channels/sdk/backend.js +102 -0
- package/dist/channels/sdk/cursor.js +56 -0
- package/dist/channels/sdk/index.js +20 -0
- package/dist/channels/sdk/jsonl.js +208 -0
- package/dist/channels/sdk/protocol.js +24 -0
- package/dist/channels/sdk/schema.js +91 -0
- package/dist/channels/sdk/wire-core.js +446 -0
- package/dist/channels/service.js +169 -0
- package/dist/channels/tui/autocomplete/autocomplete.js +42 -0
- package/dist/channels/tui/autocomplete/file-mentions.js +106 -0
- package/dist/channels/tui/autocomplete/popup.js +148 -0
- package/dist/channels/tui/autocomplete/provider.js +7 -0
- package/dist/channels/tui/autocomplete/token.js +68 -0
- package/dist/channels/tui/backend/ansi-rows.js +211 -0
- package/dist/channels/tui/backend/main-screen.js +207 -0
- package/dist/channels/tui/backend/osc.js +91 -0
- package/dist/channels/tui/backend/transcript.js +230 -0
- package/dist/channels/tui/backend/tui-backend.js +915 -0
- package/dist/channels/tui/editor/editor-model.js +543 -0
- package/dist/channels/tui/editor/editor-view.js +140 -0
- package/dist/channels/tui/editor/editor.js +275 -0
- package/dist/channels/tui/editor/undo-stack.js +35 -0
- package/dist/channels/tui/editor/visual-lines.js +126 -0
- package/dist/channels/tui/editor/word-nav.js +106 -0
- package/dist/channels/tui/history/history-viewer.js +403 -0
- package/dist/channels/tui/index.js +3 -0
- package/dist/channels/tui/layout.js +167 -0
- package/dist/channels/tui/markdown/blocks.js +111 -0
- package/dist/channels/tui/markdown/inline.js +75 -0
- package/dist/channels/tui/markdown/markdown.js +182 -0
- package/dist/channels/tui/memory/memory-viewer.js +540 -0
- package/dist/channels/tui/overlay/alt-screen.js +105 -0
- package/dist/channels/tui/overlay/overlay.js +57 -0
- package/dist/channels/tui/overlay/select-confirm.js +156 -0
- package/dist/channels/tui/panels/todo-panel.js +54 -0
- package/dist/channels/tui/panels/tool-progress-panel.js +93 -0
- package/dist/channels/tui/scroll/scroll-view.js +254 -0
- package/dist/channels/tui/status/status-line.js +76 -0
- package/dist/channels/tui/text.js +38 -0
- package/dist/channels/tui/theme.js +41 -0
- package/dist/channels/types.js +11 -0
- package/dist/channels/ui-core.js +209 -0
- package/dist/checkpoint/capture.js +45 -0
- package/dist/checkpoint/codes.js +33 -0
- package/dist/checkpoint/command.js +82 -0
- package/dist/checkpoint/gate.js +48 -0
- package/dist/checkpoint/index.js +20 -0
- package/dist/checkpoint/restore.js +172 -0
- package/dist/checkpoint/store.js +247 -0
- package/dist/checkpoint/types.js +4 -0
- package/dist/checkpoint/walk.js +146 -0
- package/dist/compaction/ccr-tools.js +112 -0
- package/dist/compaction/ccr.js +84 -0
- package/dist/compaction/codes.js +21 -0
- package/dist/compaction/index.js +18 -0
- package/dist/compaction/policy.js +200 -0
- package/dist/compaction/service.js +422 -0
- package/dist/compaction/slots.js +121 -0
- package/dist/compaction/types.js +10 -0
- package/dist/context/codes.js +40 -0
- package/dist/context/events.js +160 -0
- package/dist/context/index.js +13 -0
- package/dist/context/logger.js +136 -0
- package/dist/context/scope.js +182 -0
- package/dist/context/workspace.js +104 -0
- package/dist/contracts/agent-events.d.ts +73 -0
- package/dist/contracts/agent-events.js +16 -0
- package/dist/contracts/api.d.ts +249 -0
- package/dist/contracts/api.js +299 -0
- package/dist/contracts/approval.d.ts +37 -0
- package/dist/contracts/approval.js +9 -0
- package/dist/contracts/env-ref.d.ts +41 -0
- package/dist/contracts/env-ref.js +32 -0
- package/dist/contracts/errors.d.ts +56 -0
- package/dist/contracts/errors.js +266 -0
- package/dist/contracts/events.d.ts +70 -0
- package/dist/contracts/events.js +329 -0
- package/dist/contracts/index.d.ts +32 -0
- package/dist/contracts/index.js +26 -0
- package/dist/contracts/llm.d.ts +275 -0
- package/dist/contracts/llm.js +12 -0
- package/dist/contracts/messages.d.ts +63 -0
- package/dist/contracts/messages.js +65 -0
- package/dist/contracts/redact.d.ts +46 -0
- package/dist/contracts/redact.js +223 -0
- package/dist/contracts/tools.d.ts +197 -0
- package/dist/contracts/tools.js +33 -0
- package/dist/contracts/types.d.ts +302 -0
- package/dist/contracts/types.js +50 -0
- package/dist/contracts/ui.d.ts +122 -0
- package/dist/contracts/ui.js +15 -0
- package/dist/conversation/agent-service.js +61 -0
- package/dist/conversation/approval-wiring.js +82 -0
- package/dist/conversation/backoff.js +38 -0
- package/dist/conversation/codes.js +47 -0
- package/dist/conversation/control-tools.js +102 -0
- package/dist/conversation/control.js +210 -0
- package/dist/conversation/driver.js +922 -0
- package/dist/conversation/index.js +12 -0
- package/dist/conversation/model-visible.js +169 -0
- package/dist/conversation/open-tools.js +126 -0
- package/dist/conversation/reseed.js +132 -0
- package/dist/conversation/sessions.js +215 -0
- package/dist/conversation/todo.js +203 -0
- package/dist/conversation/types.js +35 -0
- package/dist/conversation/wiring.js +204 -0
- package/dist/credentials/codes.js +59 -0
- package/dist/credentials/commands.js +186 -0
- package/dist/credentials/env-ref.js +34 -0
- package/dist/credentials/index.js +28 -0
- package/dist/credentials/migration.js +18 -0
- package/dist/credentials/oauth.js +266 -0
- package/dist/credentials/refresh.js +152 -0
- package/dist/credentials/secrets.js +118 -0
- package/dist/credentials/types.js +30 -0
- package/dist/exec/bash.js +279 -0
- package/dist/exec/codes.js +37 -0
- package/dist/exec/env.js +99 -0
- package/dist/exec/environment.js +39 -0
- package/dist/exec/git-guard.js +623 -0
- package/dist/exec/index.js +24 -0
- package/dist/exec/registry.js +120 -0
- package/dist/exec/spawn.js +281 -0
- package/dist/exec/tail.js +77 -0
- package/dist/exec/types.js +5 -0
- package/dist/goal/codes.js +33 -0
- package/dist/goal/command.js +175 -0
- package/dist/goal/fold.js +121 -0
- package/dist/goal/gates.js +122 -0
- package/dist/goal/index.js +22 -0
- package/dist/goal/migration.js +48 -0
- package/dist/goal/service.js +501 -0
- package/dist/goal/todo-tool.js +174 -0
- package/dist/goal/types.js +1 -0
- package/dist/goal/update-tool.js +46 -0
- package/dist/host/approval-cmd.js +276 -0
- package/dist/host/assembly.js +1146 -0
- package/dist/host/boot-failures.js +104 -0
- package/dist/host/budget-advisory.js +74 -0
- package/dist/host/budget-broadcast.js +50 -0
- package/dist/host/builtins.js +54 -0
- package/dist/host/cli.js +544 -0
- package/dist/host/codes.js +120 -0
- package/dist/host/config-schema.js +195 -0
- package/dist/host/conversation-stack.js +654 -0
- package/dist/host/core-plugins.js +1685 -0
- package/dist/host/credentials-cmd.js +42 -0
- package/dist/host/disclosure.js +30 -0
- package/dist/host/dispatch.js +105 -0
- package/dist/host/doors-cmd.js +154 -0
- package/dist/host/dump-config.js +44 -0
- package/dist/host/hook-dispatch-guard.js +27 -0
- package/dist/host/import-gate.js +153 -0
- package/dist/host/index.js +54 -0
- package/dist/host/issue-session.js +241 -0
- package/dist/host/loader.js +372 -0
- package/dist/host/main.js +161 -0
- package/dist/host/manifest.js +381 -0
- package/dist/host/mcp-entry.js +53 -0
- package/dist/host/plugin-boot.js +952 -0
- package/dist/host/plugin-context.js +672 -0
- package/dist/host/plugin-install.js +480 -0
- package/dist/host/plugin-reload.js +124 -0
- package/dist/host/plugin-store.js +462 -0
- package/dist/host/plugin-tools.js +359 -0
- package/dist/host/plugin-uninstall.js +257 -0
- package/dist/host/plugins-cmd.js +302 -0
- package/dist/host/plugins-command.js +130 -0
- package/dist/host/plugins-config.js +195 -0
- package/dist/host/prompt-sections.js +133 -0
- package/dist/host/run-entry.js +544 -0
- package/dist/host/runtime.js +209 -0
- package/dist/host/scheduler-tick.js +294 -0
- package/dist/host/serve-daemon.js +501 -0
- package/dist/host/serve-entry.js +279 -0
- package/dist/host/session-anchor.js +41 -0
- package/dist/host/sessions-cmd.js +219 -0
- package/dist/host/sessions-face.js +47 -0
- package/dist/host/settings-store.js +112 -0
- package/dist/host/signals.js +69 -0
- package/dist/host/single-instance.js +105 -0
- package/dist/host/subagent-factory.js +291 -0
- package/dist/host/testkit/harness.js +283 -0
- package/dist/host/testkit/index.js +14 -0
- package/dist/host/testkit/matrix.js +302 -0
- package/dist/host/tool-policy-store.js +177 -0
- package/dist/host/triggers.js +212 -0
- package/dist/host/tui-entry.js +216 -0
- package/dist/host/webui-bridge.js +165 -0
- package/dist/issue/codes.js +38 -0
- package/dist/issue/filter.js +146 -0
- package/dist/issue/github.js +116 -0
- package/dist/issue/index.js +17 -0
- package/dist/issue/mount.js +70 -0
- package/dist/issue/poll.js +58 -0
- package/dist/issue/service.js +341 -0
- package/dist/issue/tools.js +70 -0
- package/dist/issue/types.js +34 -0
- package/dist/issue/webhook.js +126 -0
- package/dist/llm/codes.js +77 -0
- package/dist/llm/complete.js +196 -0
- package/dist/llm/events.js +15 -0
- package/dist/llm/index.js +24 -0
- package/dist/llm/inflight.js +65 -0
- package/dist/llm/model-id.js +58 -0
- package/dist/llm/provider-face.d.ts +32 -0
- package/dist/llm/provider-face.js +34 -0
- package/dist/llm/recovery.js +146 -0
- package/dist/llm/runtime.js +46 -0
- package/dist/llm/stream-fn.js +147 -0
- package/dist/lsp/codes.js +31 -0
- package/dist/lsp/connection.js +147 -0
- package/dist/lsp/frame.js +110 -0
- package/dist/lsp/index.js +16 -0
- package/dist/lsp/inject.js +58 -0
- package/dist/lsp/instance.js +264 -0
- package/dist/lsp/service.js +522 -0
- package/dist/lsp/tools.js +53 -0
- package/dist/lsp/types.js +201 -0
- package/dist/mcp/bridge.js +222 -0
- package/dist/mcp/codes.js +21 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/jsonrpc.js +230 -0
- package/dist/mcp/service.js +125 -0
- package/dist/mcp/tools.js +145 -0
- package/dist/mcp/types.js +108 -0
- package/dist/memory/cite.js +131 -0
- package/dist/memory/codes.js +50 -0
- package/dist/memory/command.js +71 -0
- package/dist/memory/consolidate.js +219 -0
- package/dist/memory/cycle.js +109 -0
- package/dist/memory/dao.js +878 -0
- package/dist/memory/diff.js +238 -0
- package/dist/memory/extract.js +181 -0
- package/dist/memory/fts.js +58 -0
- package/dist/memory/index.js +42 -0
- package/dist/memory/inject.js +354 -0
- package/dist/memory/merge.js +178 -0
- package/dist/memory/migration.js +132 -0
- package/dist/memory/pollution.js +59 -0
- package/dist/memory/port.js +385 -0
- package/dist/memory/review.js +201 -0
- package/dist/memory/scan.js +89 -0
- package/dist/memory/tools.js +508 -0
- package/dist/memory/types.js +140 -0
- package/dist/obs/codes.js +38 -0
- package/dist/obs/db.js +115 -0
- package/dist/obs/index.js +20 -0
- package/dist/obs/rollup.js +61 -0
- package/dist/obs/service.js +363 -0
- package/dist/obs/session-tools.js +282 -0
- package/dist/obs/session-view.js +225 -0
- package/dist/obs/tool.js +97 -0
- package/dist/obs/types.js +1 -0
- package/dist/persist/audit.js +63 -0
- package/dist/persist/aux.js +39 -0
- package/dist/persist/codes.js +35 -0
- package/dist/persist/index.js +30 -0
- package/dist/persist/load-history.js +50 -0
- package/dist/persist/migrations.js +37 -0
- package/dist/persist/paths.js +108 -0
- package/dist/persist/persistence.js +229 -0
- package/dist/persist/schema.js +99 -0
- package/dist/persist/secret-box.js +95 -0
- package/dist/persist/store.js +706 -0
- package/dist/persist/write-behind.js +238 -0
- package/dist/safety/approval.js +171 -0
- package/dist/safety/bwrap.js +123 -0
- package/dist/safety/codes.js +57 -0
- package/dist/safety/danger.js +505 -0
- package/dist/safety/gate.js +226 -0
- package/dist/safety/index.js +24 -0
- package/dist/safety/presets.js +73 -0
- package/dist/safety/roots.js +139 -0
- package/dist/safety/sandbox.js +214 -0
- package/dist/safety/seatbelt.js +88 -0
- package/dist/safety/sensitive.js +34 -0
- package/dist/safety/tool-policy.js +203 -0
- package/dist/safety/types.js +13 -0
- package/dist/scheduler/codes.js +54 -0
- package/dist/scheduler/cron-backend.js +135 -0
- package/dist/scheduler/engine.js +280 -0
- package/dist/scheduler/gates.js +60 -0
- package/dist/scheduler/index.js +25 -0
- package/dist/scheduler/migration.js +22 -0
- package/dist/scheduler/runner.js +171 -0
- package/dist/scheduler/schedule.js +193 -0
- package/dist/scheduler/service.js +283 -0
- package/dist/scheduler/tick.js +139 -0
- package/dist/scheduler/types.js +1 -0
- package/dist/sdk/http.js +865 -0
- package/dist/sdk/index.js +22 -0
- package/dist/sdk/mcp.js +289 -0
- package/dist/sdk/plugin-route-registry.js +126 -0
- package/dist/sdk/plugin-routes.js +149 -0
- package/dist/sdk/security.js +116 -0
- package/dist/sdk/types.js +32 -0
- package/dist/session/budget.js +159 -0
- package/dist/session/codes.js +40 -0
- package/dist/session/derive.js +180 -0
- package/dist/session/event-data.js +1 -0
- package/dist/session/fork.js +72 -0
- package/dist/session/import-gates.js +148 -0
- package/dist/session/index.js +18 -0
- package/dist/session/recover.js +103 -0
- package/dist/session/session.js +279 -0
- package/dist/session/snapshot.js +107 -0
- package/dist/skills/agents.js +242 -0
- package/dist/skills/codes.js +51 -0
- package/dist/skills/discovery.js +266 -0
- package/dist/skills/frontmatter.js +215 -0
- package/dist/skills/index.js +28 -0
- package/dist/skills/load.js +118 -0
- package/dist/skills/manage.js +201 -0
- package/dist/skills/registry.js +138 -0
- package/dist/skills/render.js +124 -0
- package/dist/skills/sections.js +171 -0
- package/dist/skills/types.js +21 -0
- package/dist/subagent/codes.js +50 -0
- package/dist/subagent/declarative.js +55 -0
- package/dist/subagent/index.js +19 -0
- package/dist/subagent/notify.js +51 -0
- package/dist/subagent/provide.js +7 -0
- package/dist/subagent/registry.js +149 -0
- package/dist/subagent/service.js +338 -0
- package/dist/subagent/surface.js +44 -0
- package/dist/subagent/tool.js +153 -0
- package/dist/subagent/types.js +25 -0
- package/dist/tools/apply-patch.js +164 -0
- package/dist/tools/codes.js +109 -0
- package/dist/tools/fs.js +501 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/observed.js +99 -0
- package/dist/tools/pipeline.js +176 -0
- package/dist/tools/protected-read.js +54 -0
- package/dist/tools/registry.js +250 -0
- package/dist/tools/search.js +451 -0
- package/dist/tools/worktree.js +327 -0
- package/dist/web/codes.js +37 -0
- package/dist/web/gate.js +43 -0
- package/dist/web/hygiene.js +195 -0
- package/dist/web/index.js +16 -0
- package/dist/web/service.js +207 -0
- package/dist/web/ssrf-guard.js +44 -0
- package/dist/web/tool.js +76 -0
- package/dist/web/types.js +10 -0
- package/dist/webui/assets/index-B-t2O8gh.js +22 -0
- package/dist/webui/assets/index-DOlgSZ9Q.css +2 -0
- package/dist/webui/index.html +14 -0
- package/dist/webui/index.js +14 -0
- package/dist/webui/server.js +549 -0
- package/dist/webui/types.js +38 -0
- package/examples/README.md +26 -0
- package/examples/minimal-code-plugin/entry.js +43 -0
- package/examples/minimal-code-plugin/package.json +12 -0
- package/examples/pure-skill-pack/package.json +14 -0
- package/examples/pure-skill-pack/skills/markdown-table/SKILL.md +32 -0
- package/package.json +86 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* /goal 命令处理器(04 §12——/goal wake 手动起闹的纯程序面;list/show 观察面)。
|
|
3
|
+
*
|
|
4
|
+
* 形态律与 /tick 同族(tick.ts 先例):五动词 argv → 人读文本;服务面守卫错
|
|
5
|
+
* (BaseError)折文本不抛(命令面是用户面不是异常面);唤醒裁决(WakeDecision)
|
|
6
|
+
* 渲染落地/拒因。真正把唤醒消息投进会话的编舞归宿主装配(批 12)——本面只
|
|
7
|
+
* 裁决与呈现。create(U10——03 §10.5 U10 落码定形注①)是创建唯一写面:
|
|
8
|
+
* 恒人面命令,模型工具面零创建位(防自激励环入口)。
|
|
9
|
+
*/
|
|
10
|
+
import { BaseError } from '../contracts/index.js';
|
|
11
|
+
import { foldGoalTodos, openGoalItems } from './fold.js';
|
|
12
|
+
export const GOAL_USAGE = [
|
|
13
|
+
'用法:/goal create <schedule 串> <objective 全文> [--write] [--budget <n>] —— 建续跑 goal(锚本会话;schedule 串形见 /tick 用法)',
|
|
14
|
+
' /goal list —— 全部 goal(状态/挂钟/预算速览)',
|
|
15
|
+
' /goal show <goalId> —— 单 goal 详情(计划态 + 归因唤醒审计)',
|
|
16
|
+
' /goal wake <goalId> —— 手动起闹(停滞/预算双复位 + 挂钟复活)',
|
|
17
|
+
' /goal approve <goalId> —— 人面批准 needsWrite(command 判据门放行链)',
|
|
18
|
+
].join('\n');
|
|
19
|
+
/**
|
|
20
|
+
* create 动词:位参 schedule/objective + 可选 --write/--budget(/tick add 同款
|
|
21
|
+
* argv 位参先例——引号感知切分在 channels 面,本面 join 复原全文;位参前置
|
|
22
|
+
* 选项后置为正形,循环宽容交错)。
|
|
23
|
+
*
|
|
24
|
+
* 守卫面分工(U10 定形注②):位参缺席/objective 仅空白/--budget 值域执法全在
|
|
25
|
+
* 命令层(goal 族既有**无码**用法错面——缺位参/未知选项/坏值同折纯文本 +
|
|
26
|
+
* GOAL_USAGE);service 面契约信任调用方零校验(0 帽穿透 = 建即死 goal,故
|
|
27
|
+
* 正整数判归命令层)。schedule 透传律(定形注⑤):零词法执法——好坏判据 =
|
|
28
|
+
* register 回执经 activate 折 GOAL_TRANSITION_INVALID + 行回卷(既有律)。
|
|
29
|
+
* 会话锚缺席(CLI 面/防御位)诚实拒——不猜默认会话源(定形注③)。
|
|
30
|
+
*/
|
|
31
|
+
async function goalCreate(rest, deps, sessionId) {
|
|
32
|
+
const usageErr = (message) => `${message}\n${GOAL_USAGE}`;
|
|
33
|
+
const positional = [];
|
|
34
|
+
let write = false;
|
|
35
|
+
let budget;
|
|
36
|
+
for (let i = 0; i < rest.length; i++) {
|
|
37
|
+
const tok = rest[i] ?? '';
|
|
38
|
+
if (tok === '--write') {
|
|
39
|
+
write = true;
|
|
40
|
+
}
|
|
41
|
+
else if (tok === '--budget') {
|
|
42
|
+
const raw = rest[++i];
|
|
43
|
+
// 正整数必需(0/负数/非数字/缺值均用法错——命令层执法)
|
|
44
|
+
if (raw === undefined || !/^\d+$/.test(raw) || Number(raw) <= 0) {
|
|
45
|
+
return usageErr(`--budget 须带正整数值(得「${raw ?? '缺席'}」)。`);
|
|
46
|
+
}
|
|
47
|
+
budget = Number(raw);
|
|
48
|
+
}
|
|
49
|
+
else if (tok.startsWith('--')) {
|
|
50
|
+
return usageErr(`未知选项「${tok}」(/goal create 仅识 --write 与 --budget)。`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
positional.push(tok);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const schedule = positional[0];
|
|
57
|
+
// objective 全文 = 余位参 join 复原;仅空白 = 用法错(service 面 length 判
|
|
58
|
+
// 不辖空白——命令层 trim 判,complete 的 evidence 同律)
|
|
59
|
+
const objective = positional.slice(1).join(' ').trim();
|
|
60
|
+
if (sessionId === undefined) {
|
|
61
|
+
return usageErr('缺会话锚——/goal create 须在会话内执行(goal 是本会话的无人值守延续)。');
|
|
62
|
+
}
|
|
63
|
+
if (!schedule || objective === '') {
|
|
64
|
+
return usageErr('create 须带两段位参:<schedule 串> <objective 全文>(objective 含空格请整体引号;schedule 串形见 /tick 用法)。');
|
|
65
|
+
}
|
|
66
|
+
const row = await deps.service.activate({
|
|
67
|
+
sessionId,
|
|
68
|
+
objective,
|
|
69
|
+
schedule,
|
|
70
|
+
needsWrite: write,
|
|
71
|
+
budgetMessagesCap: budget ?? null,
|
|
72
|
+
});
|
|
73
|
+
// 回执不探测装配态(定形注⑤)——通用文案「挂钟行已排」如实(缺席迟到
|
|
74
|
+
// 暂存系测试形,core 双件恒装载);首跑 = schedule 首到点(不开 create 即
|
|
75
|
+
// 起跑——立题档边界声明)
|
|
76
|
+
const lines = [
|
|
77
|
+
`已建 goal「${row.id}」——挂钟行已排(schedule ${row.schedule};首跑 = 首次到点,即刻续跑请直接发言)。`,
|
|
78
|
+
];
|
|
79
|
+
if (row.needsWrite) {
|
|
80
|
+
lines.push(`已申报 needsWrite(申报非授权)——/goal approve ${row.id} 批准后 command 判据门可用。`);
|
|
81
|
+
}
|
|
82
|
+
if (row.budgetMessagesCap !== null) {
|
|
83
|
+
lines.push(`预算帽 ${row.budgetMessagesCap}(前台计数 + 委派折叠合计对帽)。`);
|
|
84
|
+
}
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
87
|
+
/** /goal 处理器(argv → 人读文本;守卫错折文本;sessionId = 命令发起会话锚——U10 定形注③,缺席仅 create 受影响) */
|
|
88
|
+
export async function runGoalCommand(argv, deps, sessionId) {
|
|
89
|
+
const [verb, ...rest] = argv;
|
|
90
|
+
try {
|
|
91
|
+
switch (verb) {
|
|
92
|
+
case 'create': {
|
|
93
|
+
// return await(非裸 return)——helper 的守卫错拒绝须经本层
|
|
94
|
+
// try/catch 折文本(裸 return 的 promise 拒绝发生在 catch 出口之后)
|
|
95
|
+
return await goalCreate(rest, deps, sessionId);
|
|
96
|
+
}
|
|
97
|
+
case 'wake': {
|
|
98
|
+
const goalId = rest[0];
|
|
99
|
+
if (!goalId)
|
|
100
|
+
return `缺 goalId。\n${GOAL_USAGE}`;
|
|
101
|
+
const decision = await deps.service.wake(goalId, { trigger: 'manual', attribution: '/goal wake' });
|
|
102
|
+
return decision.landed
|
|
103
|
+
? `已手动唤醒 goal「${goalId}」(停滞/唤醒预算双复位,挂钟复活)。${decision.message}`
|
|
104
|
+
: `唤醒未落地:${decision.message}`;
|
|
105
|
+
}
|
|
106
|
+
case 'approve': {
|
|
107
|
+
// 人面批准(f-1 定形注②——批准唯一写面;守卫错折文本同面)
|
|
108
|
+
const goalId = rest[0];
|
|
109
|
+
if (!goalId)
|
|
110
|
+
return `缺 goalId。\n${GOAL_USAGE}`;
|
|
111
|
+
await deps.service.approve(goalId);
|
|
112
|
+
return `已批准 goal「${goalId}」的 needsWrite 申报——command 判据门申报解锁(todo 工具 gate 声明即刻可用)。`;
|
|
113
|
+
}
|
|
114
|
+
case 'list': {
|
|
115
|
+
const rows = deps.service.list();
|
|
116
|
+
if (rows.length === 0)
|
|
117
|
+
return '无 goal。';
|
|
118
|
+
const lines = rows.map((row) => {
|
|
119
|
+
const budget = row.budgetMessagesCap === null
|
|
120
|
+
? '无预算帽'
|
|
121
|
+
: `预算 ${row.budgetMessagesUsed + row.budgetFoldedUnits}/${row.budgetMessagesCap}`;
|
|
122
|
+
const clock = row.status === 'active' ? (row.stallStreak > 0 ? `挂钟(停滞 ${row.stallStreak})` : '挂钟在跑') : '已停摆';
|
|
123
|
+
return `- ${row.id}〔${row.status}〕${row.objective.slice(0, 40)} —— ${clock} · ${budget}`;
|
|
124
|
+
});
|
|
125
|
+
return `共 ${rows.length} 个 goal:\n${lines.join('\n')}`;
|
|
126
|
+
}
|
|
127
|
+
case 'show': {
|
|
128
|
+
const goalId = rest[0];
|
|
129
|
+
if (!goalId)
|
|
130
|
+
return `缺 goalId。\n${GOAL_USAGE}`;
|
|
131
|
+
const row = deps.service.get(goalId);
|
|
132
|
+
if (!row)
|
|
133
|
+
return `goal「${goalId}」不存在。`;
|
|
134
|
+
const scope = deps.service.goalScopeFor(row.sessionId);
|
|
135
|
+
const items = scope !== undefined && scope.goalId === goalId
|
|
136
|
+
? openGoalItems(foldGoalTodos(deps.eventsFor(row.sessionId), row.activatedSeq))
|
|
137
|
+
: [];
|
|
138
|
+
const openLine = items.length === 0
|
|
139
|
+
? 'open 项:0'
|
|
140
|
+
: `open 项:${items.length}(${items.map((i) => `[${i.status}] ${i.content}`).join(';')})`;
|
|
141
|
+
const wakes = deps.service.wakes(goalId);
|
|
142
|
+
const wakeLines = wakes.length === 0
|
|
143
|
+
? '(无唤醒记录)'
|
|
144
|
+
: wakes
|
|
145
|
+
.slice(-5)
|
|
146
|
+
.map((w) => `- ${w.wokeAt} ${w.trigger} 道 · ${w.progressed ? '有进展' : '无进展'} · 归因 ${w.attribution}`)
|
|
147
|
+
.join('\n');
|
|
148
|
+
return [
|
|
149
|
+
`goal「${goalId}」〔${row.status}〕`,
|
|
150
|
+
`目标:${row.objective}`,
|
|
151
|
+
`挂钟:${row.schedule}(激活锚 seq=${row.activatedSeq},会话 ${row.sessionId})`,
|
|
152
|
+
`预算:前台 ${row.budgetMessagesUsed} + 委派折叠 ${row.budgetFoldedUnits}${row.budgetMessagesCap === null ? '(无帽)' : ` / 帽 ${row.budgetMessagesCap}`}`,
|
|
153
|
+
`needsWrite:${row.needsWrite ? (row.writeApproved ? '已申报·已批准(command 判据门可用)' : '已申报·未批准(/goal approve 后可用)') : '未申报(command 判据门不可用)'}`,
|
|
154
|
+
`停滞计数:${row.stallStreak}(帽内复位靠进展或手动)`,
|
|
155
|
+
openLine,
|
|
156
|
+
row.endingNote !== null ? `终态回执:${row.endingNote}` : '',
|
|
157
|
+
`唤醒审计(末 5 条):\n${wakeLines}`,
|
|
158
|
+
]
|
|
159
|
+
.filter((line) => line !== '')
|
|
160
|
+
.join('\n');
|
|
161
|
+
}
|
|
162
|
+
case undefined:
|
|
163
|
+
case 'help':
|
|
164
|
+
return GOAL_USAGE;
|
|
165
|
+
default:
|
|
166
|
+
return `未知动词「${verb}」。\n${GOAL_USAGE}`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
// 守卫错折文本(命令面是用户面——BaseError 码与人读原因直呈)
|
|
171
|
+
if (err instanceof BaseError)
|
|
172
|
+
return `${err.code}:${err.message}`;
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { occludedSeqs } from '../session/index.js';
|
|
2
|
+
/** status 四值词表(与 conversation TodoItemData 同词表——结构兼容面) */
|
|
3
|
+
const TODO_STATUSES = ['pending', 'in-progress', 'completed', 'deferred'];
|
|
4
|
+
/**
|
|
5
|
+
* fold goal 段当前任务清单:倒扫 events(seq ≥ activatedSeq 的区间)——
|
|
6
|
+
* 先遇 `todo/write` → 其 items 即当前表(last-write-wins);user/message
|
|
7
|
+
* 不停扫(跨轮存活);扫出边界 → 空表(goal 段从未建表)。
|
|
8
|
+
*/
|
|
9
|
+
export function foldGoalTodos(events, activatedSeq) {
|
|
10
|
+
const occluded = occludedSeqs(events);
|
|
11
|
+
for (let seq = events.length - 1; seq >= 0; seq -= 1) {
|
|
12
|
+
if (seq < activatedSeq)
|
|
13
|
+
return []; // 越激活锚即出 goal 段——锚前历史不成表
|
|
14
|
+
if (occluded.has(seq))
|
|
15
|
+
continue;
|
|
16
|
+
const event = events[seq];
|
|
17
|
+
if (event.type === 'todo/write')
|
|
18
|
+
return validateGoalTodoItems(event.data.items);
|
|
19
|
+
// user/message 不重置(goal 生命周期段语义);assistant/工具事件同不停扫
|
|
20
|
+
}
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* open 项集(完成否决律判据面):open = 一切非 completed 状态项——
|
|
25
|
+
* deferred 含内无论窗到否(判窗是续跑提示的提示词义务,非机器放行面)。
|
|
26
|
+
*/
|
|
27
|
+
export function openGoalItems(items) {
|
|
28
|
+
return items.filter((item) => item.status !== 'completed');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* fold 投影指纹(停滞判据面,04 §12 停滞硬停条):计数分桶 + 逐条内容
|
|
32
|
+
* 散列——条目状态翻转或内容改写即变(planning-with-files ③ 单调进度护卫
|
|
33
|
+
* 的最小形:不做单调性断言,只做变更检测——单调性挂真实使用回访)。
|
|
34
|
+
*/
|
|
35
|
+
export function progressFingerprint(items) {
|
|
36
|
+
const counts = { pending: 0, 'in-progress': 0, completed: 0, deferred: 0 };
|
|
37
|
+
const parts = [];
|
|
38
|
+
for (const item of items) {
|
|
39
|
+
counts[item.status] += 1;
|
|
40
|
+
// status+content+扩展语义字段全入指纹——resume_when 改窗也是进展
|
|
41
|
+
parts.push(`${item.status}|${item.content}|${item.resumeWhen ?? ''}|${item.role ?? ''}|` +
|
|
42
|
+
`${item.taskClass ?? ''}|${item.followUp ?? ''}|${item.noFollowUp === true ? 1 : 0}|` +
|
|
43
|
+
`${item.gate ? JSON.stringify(item.gate) : ''}`);
|
|
44
|
+
}
|
|
45
|
+
return `p${counts.pending},i${counts['in-progress']},c${counts.completed},d${counts.deferred};${parts.join(';')}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* resume_when 词法解析(03 §10.5 deferred 必携条):`after@<ISO>` 绝对形
|
|
49
|
+
* 或 `after@+<n>[mhd]` 相对形(判窗锚 = 条目写入时刻——由调用方供锚)。
|
|
50
|
+
* 返回 null = 坏形(写侧 GOAL_TODO_SCOPE 拒、读侧不判窗机器面零消费)。
|
|
51
|
+
*/
|
|
52
|
+
export function parseResumeWhen(spec, anchorMs) {
|
|
53
|
+
if (!spec.startsWith('after@'))
|
|
54
|
+
return { ok: false, error: `resume_when 须以 after@ 起头(得「${spec}」)` };
|
|
55
|
+
const body = spec.slice('after@'.length);
|
|
56
|
+
// 绝对 ISO 形
|
|
57
|
+
if (!body.startsWith('+')) {
|
|
58
|
+
const ms = Date.parse(body);
|
|
59
|
+
if (Number.isNaN(ms))
|
|
60
|
+
return { ok: false, error: `after@ 后非合法 ISO 时间串(得「${body}」)` };
|
|
61
|
+
return { ok: true, dueAtMs: ms };
|
|
62
|
+
}
|
|
63
|
+
// 相对形:+<n>[mhd]
|
|
64
|
+
const m = /^\+(\d{1,8})([mhd])$/.exec(body);
|
|
65
|
+
if (!m)
|
|
66
|
+
return { ok: false, error: `相对形须为 +<正整数>[mhd](得「${body}」)` };
|
|
67
|
+
const n = Number(m[1]);
|
|
68
|
+
const unitMs = m[2] === 'm' ? 60_000 : m[2] === 'h' ? 3_600_000 : 86_400_000;
|
|
69
|
+
return { ok: true, dueAtMs: anchorMs + n * unitMs };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 未知载荷 → goal 段条目列表(fold 读侧收窄面):status 出词表/content
|
|
73
|
+
* 非串 → 整条丢弃;扩展字段仅收对应型别(型别不符剔除该字段不弃整条——
|
|
74
|
+
* 核心四字段健康即保留,扩展面保守降级)。
|
|
75
|
+
*/
|
|
76
|
+
export function validateGoalTodoItems(value) {
|
|
77
|
+
if (!Array.isArray(value))
|
|
78
|
+
return [];
|
|
79
|
+
const items = [];
|
|
80
|
+
for (const entry of value) {
|
|
81
|
+
if (typeof entry !== 'object' || entry === null)
|
|
82
|
+
continue;
|
|
83
|
+
const c = entry;
|
|
84
|
+
if (typeof c.status !== 'string' ||
|
|
85
|
+
!TODO_STATUSES.includes(c.status) ||
|
|
86
|
+
typeof c.content !== 'string') {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// 可写局部(WritableGoalTodoItem——readonly 契约形由收窄返回承载)
|
|
90
|
+
const item = { status: c.status, content: c.content };
|
|
91
|
+
if (typeof c.activeForm === 'string')
|
|
92
|
+
item.activeForm = c.activeForm;
|
|
93
|
+
if (typeof c.resumeWhen === 'string')
|
|
94
|
+
item.resumeWhen = c.resumeWhen;
|
|
95
|
+
if (c.role === 'agent' || c.role === 'user')
|
|
96
|
+
item.role = c.role;
|
|
97
|
+
if (typeof c.taskClass === 'string')
|
|
98
|
+
item.taskClass = c.taskClass;
|
|
99
|
+
if (typeof c.followUp === 'string')
|
|
100
|
+
item.followUp = c.followUp;
|
|
101
|
+
if (c.noFollowUp === true)
|
|
102
|
+
item.noFollowUp = true;
|
|
103
|
+
if (isGateSpec(c.gate))
|
|
104
|
+
item.gate = c.gate;
|
|
105
|
+
items.push(item);
|
|
106
|
+
}
|
|
107
|
+
return items;
|
|
108
|
+
}
|
|
109
|
+
/** gate 声明收窄(三源判据门形——{kind, spec} 平铺形) */
|
|
110
|
+
function isGateSpec(value) {
|
|
111
|
+
if (typeof value !== 'object' || value === null)
|
|
112
|
+
return false;
|
|
113
|
+
const g = value;
|
|
114
|
+
if (g.kind === 'command' && typeof g.command === 'string')
|
|
115
|
+
return true;
|
|
116
|
+
if (g.kind === 'files' && Array.isArray(g.paths) && g.paths.every((p) => typeof p === 'string'))
|
|
117
|
+
return true;
|
|
118
|
+
if (g.kind === 'diagnostics' && Array.isArray(g.files) && g.files.every((f) => typeof f === 'string'))
|
|
119
|
+
return true;
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 判据门三源评测机(03 §10.5 gates 条——fail-closed)。
|
|
3
|
+
*
|
|
4
|
+
* 三源判据(goal 段 todo 项可选 gate 声明,完成否决律消费):
|
|
5
|
+
* - `command`:exit 0 放行、超时帽 30s、走 exec 三段管道全执法(exec seam
|
|
6
|
+
* 组合根注入——**v1 未接线**〔03 §10.5 s 批补注①诚实缺席律〕:todo 申报位
|
|
7
|
+
* hasCommandExec 判据拒 + 评测位本件 fail 双拦,真接线随「exec 判据门真
|
|
8
|
+
* 接线」立题批);**仅 goal needsWrite 申报批准后可用**(模型自造命令免
|
|
9
|
+
* 审批自跑是注入面——申报位与评测位双拦);
|
|
10
|
+
* - `files`:全部存在且非空;stat 前归一判工作区根内(裸 stat 不得是无
|
|
11
|
+
* fence 存在性 oracle——路径归一后越根即 fail);
|
|
12
|
+
* - `diagnostics`:目标文件集 LSP 诊断无 error 级;lsp 查询窄面缺席时
|
|
13
|
+
* **评测位亦 fail**(申报位已拒,双拦防御——fail-closed 非静默跳过)。
|
|
14
|
+
*
|
|
15
|
+
* 评测原则:一切 seam 缺席 = fail(不是 skip)——判据门是完成否决的机器
|
|
16
|
+
* 面,门面不在场即门不放行。
|
|
17
|
+
*/
|
|
18
|
+
import { isAbsolute, resolve, sep } from 'node:path';
|
|
19
|
+
import { statSync } from 'node:fs';
|
|
20
|
+
/** command gate 超时帽(30s——04 §12 exec 三段管道墙钟同量级) */
|
|
21
|
+
export const GATE_COMMAND_TIMEOUT_MS = 30_000;
|
|
22
|
+
/**
|
|
23
|
+
* 评测全部 gate 声明(完成否决律的机器面):逐条独立评测、全量返回——
|
|
24
|
+
* 调用方聚合判「全绿」。无 gate 声明的条目不产条目(零门 = 零评测)。
|
|
25
|
+
*/
|
|
26
|
+
export async function evaluateGoalGates(items, deps) {
|
|
27
|
+
const outcomes = [];
|
|
28
|
+
for (const item of items) {
|
|
29
|
+
if (item.gate === undefined)
|
|
30
|
+
continue;
|
|
31
|
+
outcomes.push(await evaluateOne(item.gate, deps));
|
|
32
|
+
}
|
|
33
|
+
return outcomes;
|
|
34
|
+
}
|
|
35
|
+
/** 单门评测(fail-closed 分派) */
|
|
36
|
+
async function evaluateOne(spec, deps) {
|
|
37
|
+
switch (spec.kind) {
|
|
38
|
+
case 'command':
|
|
39
|
+
return evaluateCommand(spec.command, deps);
|
|
40
|
+
case 'files':
|
|
41
|
+
return evaluateFiles(spec.paths, deps);
|
|
42
|
+
case 'diagnostics':
|
|
43
|
+
return evaluateDiagnostics(spec.files, deps);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** command 源:needsWrite 批准 + seam 在场 + exit 0 三条件全过才放行 */
|
|
47
|
+
async function evaluateCommand(command, deps) {
|
|
48
|
+
if (!deps.commandGateAllowed) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
kind: 'command',
|
|
52
|
+
detail: 'goal 未申报 needsWrite(或未获批准)——command 判据门不可用(防模型自造命令免审批自跑)',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (deps.exec === undefined) {
|
|
56
|
+
return { ok: false, kind: 'command', detail: 'exec 执行面缺席——fail-closed 不放行(组合根未接线)' };
|
|
57
|
+
}
|
|
58
|
+
const result = await deps.exec.execCommand(command);
|
|
59
|
+
if (result.timedOut) {
|
|
60
|
+
return { ok: false, kind: 'command', detail: `命令超时(>${GATE_COMMAND_TIMEOUT_MS}ms)——判未过` };
|
|
61
|
+
}
|
|
62
|
+
if (result.exitCode !== 0) {
|
|
63
|
+
const tail = result.stderrTail === '' ? '' : `(stderr 末行:${result.stderrTail})`;
|
|
64
|
+
return { ok: false, kind: 'command', detail: `退出码 ${result.exitCode} 非 0${tail}` };
|
|
65
|
+
}
|
|
66
|
+
return { ok: true, kind: 'command', detail: `exit 0(命令:${command})` };
|
|
67
|
+
}
|
|
68
|
+
/** files 源:全部存在且非空;stat 前归一判工作区根内 */
|
|
69
|
+
function evaluateFiles(paths, deps) {
|
|
70
|
+
if (paths.length === 0) {
|
|
71
|
+
return { ok: false, kind: 'files', detail: '空目标集——空门即非门(申报位已拦,评测位双拦)' };
|
|
72
|
+
}
|
|
73
|
+
const root = deps.workspaceRoot;
|
|
74
|
+
const stat = deps.statFile ?? statFileDefault;
|
|
75
|
+
for (const p of paths) {
|
|
76
|
+
// 归一判根:resolve 锚工作区根(相对路径合法——判根后落根内);越根即 fail
|
|
77
|
+
const abs = isAbsolute(p) ? resolve(p) : resolve(root, p);
|
|
78
|
+
if (abs !== root && !abs.startsWith(root + sep)) {
|
|
79
|
+
return {
|
|
80
|
+
ok: false,
|
|
81
|
+
kind: 'files',
|
|
82
|
+
detail: `路径「${p}」归一后在工作区根外(${abs})——裸 stat 不是存在性 oracle`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const s = stat(abs);
|
|
86
|
+
if (!s.exists)
|
|
87
|
+
return { ok: false, kind: 'files', detail: `文件不存在:${p}` };
|
|
88
|
+
if (s.size === 0)
|
|
89
|
+
return { ok: false, kind: 'files', detail: `文件为空:${p}` };
|
|
90
|
+
}
|
|
91
|
+
return { ok: true, kind: 'files', detail: `${paths.length} 个文件全部存在且非空` };
|
|
92
|
+
}
|
|
93
|
+
/** diagnostics 源:目标文件集 LSP 诊断无 error 级 */
|
|
94
|
+
async function evaluateDiagnostics(files, deps) {
|
|
95
|
+
if (files.length === 0) {
|
|
96
|
+
return { ok: false, kind: 'diagnostics', detail: '空目标集——空门即非门(申报位已拦,评测位双拦)' };
|
|
97
|
+
}
|
|
98
|
+
if (deps.lsp === undefined) {
|
|
99
|
+
return { ok: false, kind: 'diagnostics', detail: 'lsp 诊断查询面缺席——fail-closed 不放行(组合根未接线)' };
|
|
100
|
+
}
|
|
101
|
+
const diags = await deps.lsp.queryDiagnostics([...files]);
|
|
102
|
+
const errors = diags.filter((d) => d.level === 'error');
|
|
103
|
+
if (errors.length > 0) {
|
|
104
|
+
const first = errors[0];
|
|
105
|
+
return {
|
|
106
|
+
ok: false,
|
|
107
|
+
kind: 'diagnostics',
|
|
108
|
+
detail: `${errors.length} 条 error 级诊断(如 ${first.file}: ${first.message})`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return { ok: true, kind: 'diagnostics', detail: `${files.length} 个目标文件无 error 级诊断` };
|
|
112
|
+
}
|
|
113
|
+
/** 文件源缺省真身(node:fs statSync——测试注 statFile 假件后不触盘) */
|
|
114
|
+
function statFileDefault(p) {
|
|
115
|
+
try {
|
|
116
|
+
const s = statSync(p);
|
|
117
|
+
return { exists: true, size: Number(s.size) };
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return { exists: false, size: 0 };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* goal 模块公开面(L3——02 §4.1 席 23;机制真源 03 §10.5 + 04 §12)。
|
|
3
|
+
*
|
|
4
|
+
* 本批落码:goals 表族(migration v3)+ 计划态跨轮 fold(goal 段倒扫)+
|
|
5
|
+
* todo 工具换装件(GOAL_TODO_SCOPE 段约束双向执法)+ goal_update 终态申报件
|
|
6
|
+
* (完成否决律机器面)+ 判据门三源评测(fail-closed)+ GoalService(生命周期/
|
|
7
|
+
* wake 双帽/停滞硬停/重绑护栏/归因落账/预算双轨/挂钟迟到注入)+ /goal 命令。
|
|
8
|
+
* 装载态集成(批 19c-3 + 批 #99 驱动侧接线收口):todo 换装(openTools
|
|
9
|
+
* todoTool 注入位)、goalScopeFor 注入(组合根闭包 → 驱动 fold 升格锚)、
|
|
10
|
+
* 挂钟引擎消费(双序迟到注入)、agent_pre_step 预算复验监听(ctx.on 瀑布
|
|
11
|
+
* ——budgetExceeded 置 stop)、recordTurn 记账腿(驱动 onRunSettled 窗扫
|
|
12
|
+
* 供给 messages 计数——三入口统一)、depositFor 轮间沉淀(goalDeposit 注入
|
|
13
|
+
* 位 + 指纹缓存单发)六件已入册 core:goal——run 入口批挂账全数兑现。
|
|
14
|
+
*/
|
|
15
|
+
import './codes.js';
|
|
16
|
+
export { GOAL_MIGRATION, GOAL_APPROVAL_MIGRATION } from './migration.js';
|
|
17
|
+
export { foldGoalTodos, openGoalItems, progressFingerprint, parseResumeWhen, validateGoalTodoItems } from './fold.js';
|
|
18
|
+
export { evaluateGoalGates, GATE_COMMAND_TIMEOUT_MS, } from './gates.js';
|
|
19
|
+
export { createGoalTodoTool } from './todo-tool.js';
|
|
20
|
+
export { createGoalUpdateTool } from './update-tool.js';
|
|
21
|
+
export { createGoalService, DEFAULT_STALL_LIMIT, DEFAULT_WAKE_BUDGET_LIMIT, GOAL_DEPOSIT_MAX_CHARS, } from './service.js';
|
|
22
|
+
export { runGoalCommand, GOAL_USAGE } from './command.js';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export const GOAL_MIGRATION = {
|
|
2
|
+
version: 3,
|
|
3
|
+
name: 'goal-goals',
|
|
4
|
+
sql: `
|
|
5
|
+
CREATE TABLE goals (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
session_id TEXT NOT NULL,
|
|
8
|
+
objective TEXT NOT NULL,
|
|
9
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'completed', 'abandoned')),
|
|
10
|
+
activated_seq INTEGER NOT NULL,
|
|
11
|
+
schedule TEXT NOT NULL,
|
|
12
|
+
prompt_snapshot TEXT NOT NULL,
|
|
13
|
+
needs_write INTEGER NOT NULL DEFAULT 0,
|
|
14
|
+
budget_messages_cap INTEGER,
|
|
15
|
+
budget_messages_used INTEGER NOT NULL DEFAULT 0,
|
|
16
|
+
budget_folded_units INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
stall_streak INTEGER NOT NULL DEFAULT 0,
|
|
18
|
+
wake_streak INTEGER NOT NULL DEFAULT 0,
|
|
19
|
+
last_fingerprint TEXT,
|
|
20
|
+
created_at TEXT NOT NULL,
|
|
21
|
+
updated_at TEXT NOT NULL,
|
|
22
|
+
ended_at TEXT,
|
|
23
|
+
ending_note TEXT
|
|
24
|
+
);
|
|
25
|
+
CREATE INDEX idx_goals_session_active ON goals (session_id) WHERE status = 'active';
|
|
26
|
+
CREATE TABLE goal_wakes (
|
|
27
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
28
|
+
goal_id TEXT NOT NULL REFERENCES goals (id),
|
|
29
|
+
woke_at TEXT NOT NULL,
|
|
30
|
+
trigger TEXT NOT NULL CHECK (trigger IN ('clock', 'manual')),
|
|
31
|
+
attribution TEXT NOT NULL,
|
|
32
|
+
fingerprint TEXT NOT NULL,
|
|
33
|
+
progressed INTEGER NOT NULL
|
|
34
|
+
);
|
|
35
|
+
CREATE INDEX idx_goal_wakes_goal ON goal_wakes (goal_id);
|
|
36
|
+
`,
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* goals 表增列迁移(迁移 v12——f-1 批 2026-09-13;05 §6.4「号随注册序顺延」:
|
|
40
|
+
* v11 memory 谱系批后本件顺占 v12)。write_approved = needsWrite 人面批准位
|
|
41
|
+
* (03 §10.5 f-1 定形注①——双 durable 位之批准位;缺省 0,唯一写面 =
|
|
42
|
+
* /goal approve)。
|
|
43
|
+
*/
|
|
44
|
+
export const GOAL_APPROVAL_MIGRATION = {
|
|
45
|
+
version: 12,
|
|
46
|
+
name: 'goal-write-approved',
|
|
47
|
+
sql: `ALTER TABLE goals ADD COLUMN write_approved INTEGER NOT NULL DEFAULT 0;`,
|
|
48
|
+
};
|