deepclause-sdk 0.0.89 → 0.1.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/README.md +481 -941
- package/dist/agent.d.ts +19 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +75 -21
- package/dist/agent.js.map +1 -1
- package/dist/cli/config.d.ts +385 -178
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +161 -188
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -411
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/login.d.ts +29 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +184 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/readline.d.ts +6 -0
- package/dist/cli/readline.d.ts.map +1 -0
- package/dist/cli/readline.js +15 -0
- package/dist/cli/readline.js.map +1 -0
- package/dist/cli/repl-bin.d.ts +9 -0
- package/dist/cli/repl-bin.d.ts.map +1 -0
- package/dist/cli/repl-bin.js +16 -0
- package/dist/cli/repl-bin.js.map +1 -0
- package/dist/cli/repl.d.ts +216 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +1392 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.d.ts +17 -18
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +202 -183
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/set-backend.d.ts +53 -0
- package/dist/cli/set-backend.d.ts.map +1 -0
- package/dist/cli/set-backend.js +259 -0
- package/dist/cli/set-backend.js.map +1 -0
- package/dist/cli/visualize.d.ts +42 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +150 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/compiler.d.ts +5 -52
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +4 -768
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +27 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/prolog/bridge.d.ts +5 -1
- package/dist/prolog/bridge.d.ts.map +1 -1
- package/dist/prolog/bridge.js +10 -1
- package/dist/prolog/bridge.js.map +1 -1
- package/dist/prolog-src/deepclause_analysis.pl +10 -2
- package/dist/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/repl/agent.d.ts +90 -0
- package/dist/repl/agent.d.ts.map +1 -0
- package/dist/repl/agent.js +410 -0
- package/dist/repl/agent.js.map +1 -0
- package/dist/repl/auth.d.ts +45 -0
- package/dist/repl/auth.d.ts.map +1 -0
- package/dist/repl/auth.js +116 -0
- package/dist/repl/auth.js.map +1 -0
- package/dist/repl/backend.d.ts +321 -0
- package/dist/repl/backend.d.ts.map +1 -0
- package/dist/repl/backend.js +415 -0
- package/dist/repl/backend.js.map +1 -0
- package/dist/repl/compaction.d.ts +122 -0
- package/dist/repl/compaction.d.ts.map +1 -0
- package/dist/repl/compaction.js +318 -0
- package/dist/repl/compaction.js.map +1 -0
- package/dist/repl/export.d.ts +30 -0
- package/dist/repl/export.d.ts.map +1 -0
- package/dist/repl/export.js +23 -0
- package/dist/repl/export.js.map +1 -0
- package/dist/repl/frames.d.ts +21 -0
- package/dist/repl/frames.d.ts.map +1 -0
- package/dist/repl/frames.js +79 -0
- package/dist/repl/frames.js.map +1 -0
- package/dist/repl/harness-tools.d.ts +99 -0
- package/dist/repl/harness-tools.d.ts.map +1 -0
- package/dist/repl/harness-tools.js +192 -0
- package/dist/repl/harness-tools.js.map +1 -0
- package/dist/repl/highlight.d.ts +30 -0
- package/dist/repl/highlight.d.ts.map +1 -0
- package/dist/repl/highlight.js +285 -0
- package/dist/repl/highlight.js.map +1 -0
- package/dist/repl/history.d.ts +234 -0
- package/dist/repl/history.d.ts.map +1 -0
- package/dist/repl/history.js +661 -0
- package/dist/repl/history.js.map +1 -0
- package/dist/repl/imagegen.d.ts +29 -0
- package/dist/repl/imagegen.d.ts.map +1 -0
- package/dist/repl/imagegen.js +84 -0
- package/dist/repl/imagegen.js.map +1 -0
- package/dist/repl/index.d.ts +130 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +112 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/repl/judge.d.ts +51 -0
- package/dist/repl/judge.d.ts.map +1 -0
- package/dist/repl/judge.js +58 -0
- package/dist/repl/judge.js.map +1 -0
- package/dist/repl/markdown.d.ts +25 -0
- package/dist/repl/markdown.d.ts.map +1 -0
- package/dist/repl/markdown.js +103 -0
- package/dist/repl/markdown.js.map +1 -0
- package/dist/repl/model-resolver.d.ts +59 -0
- package/dist/repl/model-resolver.d.ts.map +1 -0
- package/dist/repl/model-resolver.js +156 -0
- package/dist/repl/model-resolver.js.map +1 -0
- package/dist/repl/picker.d.ts +34 -0
- package/dist/repl/picker.d.ts.map +1 -0
- package/dist/repl/picker.js +81 -0
- package/dist/repl/picker.js.map +1 -0
- package/dist/repl/project-context.d.ts +16 -0
- package/dist/repl/project-context.d.ts.map +1 -0
- package/dist/repl/project-context.js +23 -0
- package/dist/repl/project-context.js.map +1 -0
- package/dist/repl/render.d.ts +187 -0
- package/dist/repl/render.d.ts.map +1 -0
- package/dist/repl/render.js +808 -0
- package/dist/repl/render.js.map +1 -0
- package/dist/repl/session.d.ts +424 -0
- package/dist/repl/session.d.ts.map +1 -0
- package/dist/repl/session.js +1473 -0
- package/dist/repl/session.js.map +1 -0
- package/dist/repl/status.d.ts +100 -0
- package/dist/repl/status.d.ts.map +1 -0
- package/dist/repl/status.js +218 -0
- package/dist/repl/status.js.map +1 -0
- package/dist/repl/tools.d.ts +53 -0
- package/dist/repl/tools.d.ts.map +1 -0
- package/dist/repl/tools.js +307 -0
- package/dist/repl/tools.js.map +1 -0
- package/dist/repl/toolset.d.ts +32 -0
- package/dist/repl/toolset.d.ts.map +1 -0
- package/dist/repl/toolset.js +82 -0
- package/dist/repl/toolset.js.map +1 -0
- package/dist/repl/tui/editor.d.ts +17 -0
- package/dist/repl/tui/editor.d.ts.map +1 -0
- package/dist/repl/tui/editor.js +39 -0
- package/dist/repl/tui/editor.js.map +1 -0
- package/dist/repl/tui/status-bar.d.ts +26 -0
- package/dist/repl/tui/status-bar.d.ts.map +1 -0
- package/dist/repl/tui/status-bar.js +47 -0
- package/dist/repl/tui/status-bar.js.map +1 -0
- package/dist/repl/tui/theme.d.ts +30 -0
- package/dist/repl/tui/theme.d.ts.map +1 -0
- package/dist/repl/tui/theme.js +81 -0
- package/dist/repl/tui/theme.js.map +1 -0
- package/dist/repl/tui/transcript.d.ts +41 -0
- package/dist/repl/tui/transcript.d.ts.map +1 -0
- package/dist/repl/tui/transcript.js +139 -0
- package/dist/repl/tui/transcript.js.map +1 -0
- package/dist/runner.d.ts +143 -13
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +532 -290
- package/dist/runner.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -32
- package/dist/sdk.js.map +1 -1
- package/dist/system/assets/docs/AGENT_PROMPT.md +1447 -0
- package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
- package/dist/system/assets/docs/DML_REFERENCE.md +344 -72
- package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
- package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
- package/dist/system/assets/docs/META_PROMPT.md +68 -0
- package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
- package/dist/system/assets/index.d.ts +9 -17
- package/dist/system/assets/index.d.ts.map +1 -1
- package/dist/system/assets/index.js +26 -85
- package/dist/system/assets/index.js.map +1 -1
- package/dist/system/runtime/agentvm-manager.d.ts +9 -2
- package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
- package/dist/system/runtime/agentvm-manager.js +70 -44
- package/dist/system/runtime/agentvm-manager.js.map +1 -1
- package/dist/system/runtime/media.d.ts +23 -0
- package/dist/system/runtime/media.d.ts.map +1 -0
- package/dist/system/runtime/media.js +55 -0
- package/dist/system/runtime/media.js.map +1 -0
- package/dist/system/runtime/shell-limits.d.ts +21 -0
- package/dist/system/runtime/shell-limits.d.ts.map +1 -0
- package/dist/system/runtime/shell-limits.js +39 -0
- package/dist/system/runtime/shell-limits.js.map +1 -0
- package/dist/system/runtime/shell-manager.d.ts +8 -3
- package/dist/system/runtime/shell-manager.d.ts.map +1 -1
- package/dist/system/runtime/shell-manager.js +56 -39
- package/dist/system/runtime/shell-manager.js.map +1 -1
- package/dist/system/runtime/shell-tool-events.js +5 -0
- package/dist/system/runtime/shell-tool-events.js.map +1 -1
- package/dist/system/runtime/token-usage.d.ts +2 -0
- package/dist/system/runtime/token-usage.d.ts.map +1 -1
- package/dist/system/runtime/token-usage.js +7 -0
- package/dist/system/runtime/token-usage.js.map +1 -1
- package/dist/tools.d.ts +3 -21
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +14 -168
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +136 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +338 -0
- package/dist/validate.js.map +1 -0
- package/dist/visualize/ascii.d.ts +55 -0
- package/dist/visualize/ascii.d.ts.map +1 -0
- package/dist/visualize/ascii.js +242 -0
- package/dist/visualize/ascii.js.map +1 -0
- package/dist/visualize/display.d.ts +24 -0
- package/dist/visualize/display.d.ts.map +1 -0
- package/dist/visualize/display.js +29 -0
- package/dist/visualize/display.js.map +1 -0
- package/dist/visualize/graphics.d.ts +35 -0
- package/dist/visualize/graphics.d.ts.map +1 -0
- package/dist/visualize/graphics.js +96 -0
- package/dist/visualize/graphics.js.map +1 -0
- package/dist/visualize/image.d.ts +38 -0
- package/dist/visualize/image.d.ts.map +1 -0
- package/dist/visualize/image.js +95 -0
- package/dist/visualize/image.js.map +1 -0
- package/dist/visualize/index.d.ts +59 -0
- package/dist/visualize/index.d.ts.map +1 -0
- package/dist/visualize/index.js +198 -0
- package/dist/visualize/index.js.map +1 -0
- package/dist/visualize/raster.d.ts +23 -0
- package/dist/visualize/raster.d.ts.map +1 -0
- package/dist/visualize/raster.js +47 -0
- package/dist/visualize/raster.js.map +1 -0
- package/dist/visualize/svg.d.ts +39 -0
- package/dist/visualize/svg.d.ts.map +1 -0
- package/dist/visualize/svg.js +148 -0
- package/dist/visualize/svg.js.map +1 -0
- package/dist/visualize/transcode.d.ts +13 -0
- package/dist/visualize/transcode.d.ts.map +1 -0
- package/dist/visualize/transcode.js +40 -0
- package/dist/visualize/transcode.js.map +1 -0
- package/docs/images/repl.png +0 -0
- package/package.json +19 -15
- package/src/prolog-src/deepclause_analysis.pl +10 -2
- package/src/prolog-src/deepclause_mi.pl +2440 -49
- package/dist/cli/commands.d.ts +0 -42
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -246
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/compile.d.ts +0 -99
- package/dist/cli/compile.d.ts.map +0 -1
- package/dist/cli/compile.js +0 -363
- package/dist/cli/compile.js.map +0 -1
- package/dist/cli/default-skills.d.ts +0 -10
- package/dist/cli/default-skills.d.ts.map +0 -1
- package/dist/cli/default-skills.js +0 -206
- package/dist/cli/default-skills.js.map +0 -1
- package/dist/cli/interactive.d.ts +0 -2
- package/dist/cli/interactive.d.ts.map +0 -1
- package/dist/cli/interactive.js +0 -20
- package/dist/cli/interactive.js.map +0 -1
- package/dist/cli/mcp.d.ts +0 -56
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -138
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -2
- package/dist/cli/prompt.d.ts.map +0 -1
- package/dist/cli/prompt.js +0 -2
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/search.d.ts +0 -19
- package/dist/cli/search.d.ts.map +0 -1
- package/dist/cli/search.js +0 -189
- package/dist/cli/search.js.map +0 -1
- package/dist/cli/tool-args.d.ts +0 -2
- package/dist/cli/tool-args.d.ts.map +0 -1
- package/dist/cli/tool-args.js +0 -39
- package/dist/cli/tool-args.js.map +0 -1
- package/dist/cli/tools.d.ts +0 -36
- package/dist/cli/tools.d.ts.map +0 -1
- package/dist/cli/tools.js +0 -229
- package/dist/cli/tools.js.map +0 -1
- package/dist/cli/tui/index.d.ts +0 -22
- package/dist/cli/tui/index.d.ts.map +0 -1
- package/dist/cli/tui/index.js +0 -29
- package/dist/cli/tui/index.js.map +0 -1
- package/dist/cli/tui.d.ts +0 -167
- package/dist/cli/tui.d.ts.map +0 -1
- package/dist/cli/tui.js +0 -5228
- package/dist/cli/tui.js.map +0 -1
- package/dist/compiler_prompt.d.ts +0 -20
- package/dist/compiler_prompt.d.ts.map +0 -1
- package/dist/compiler_prompt.js +0 -870
- package/dist/compiler_prompt.js.map +0 -1
- package/dist/deepclause-cli.skill +0 -0
- package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
- package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
- package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
- package/dist/system/assets/docs/TUI.md +0 -150
- package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
- package/dist/system/assets/skills/conductor.dml +0 -76
- package/dist/system/assets/skills/deep-planner.dml +0 -412
- package/dist/system/assets/skills/plan.dml +0 -429
- package/dist/system/assets/skills/security-planner.dml +0 -337
- package/dist/system/assets/skills/skill-creator.dml +0 -187
- package/dist/system/runtime/catalog-recipes.d.ts +0 -24
- package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
- package/dist/system/runtime/catalog-recipes.js +0 -273
- package/dist/system/runtime/catalog-recipes.js.map +0 -1
- package/dist/system/runtime/catalog-skills.d.ts +0 -50
- package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
- package/dist/system/runtime/catalog-skills.js +0 -152
- package/dist/system/runtime/catalog-skills.js.map +0 -1
- package/dist/system/runtime/conductor.d.ts +0 -105
- package/dist/system/runtime/conductor.d.ts.map +0 -1
- package/dist/system/runtime/conductor.js +0 -732
- package/dist/system/runtime/conductor.js.map +0 -1
- package/dist/system/runtime/console-capture.d.ts +0 -9
- package/dist/system/runtime/console-capture.d.ts.map +0 -1
- package/dist/system/runtime/console-capture.js +0 -67
- package/dist/system/runtime/console-capture.js.map +0 -1
- package/dist/system/runtime/dml-executor.d.ts +0 -52
- package/dist/system/runtime/dml-executor.d.ts.map +0 -1
- package/dist/system/runtime/dml-executor.js +0 -203
- package/dist/system/runtime/dml-executor.js.map +0 -1
- package/dist/system/runtime/runtime-tools.d.ts +0 -31
- package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
- package/dist/system/runtime/runtime-tools.js +0 -312
- package/dist/system/runtime/runtime-tools.js.map +0 -1
- package/dist/system/runtime/skill-creator.d.ts +0 -38
- package/dist/system/runtime/skill-creator.d.ts.map +0 -1
- package/dist/system/runtime/skill-creator.js +0 -763
- package/dist/system/runtime/skill-creator.js.map +0 -1
- package/src/prolog-src/deepclause_mi.pl.bak +0 -570
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# DML authoring guide (REPL)
|
|
2
|
+
|
|
3
|
+
How to think about a REPL harness. For code, see `HARNESS_EXAMPLES.md` (idiomatic
|
|
4
|
+
harness shapes) and `PROLOG_SNIPPETS.md` (tested building blocks).
|
|
5
|
+
|
|
6
|
+
## 0. What a harness is
|
|
7
|
+
|
|
8
|
+
A harness is a **living library of reusable DML skills** for the workspace —
|
|
9
|
+
not a single program. A skill is a predicate; name them descriptively and run
|
|
10
|
+
them with `execute` (during a turn) or `/goal`. Skills are built from:
|
|
11
|
+
|
|
12
|
+
- **helper predicates** (plain Prolog/CLP),
|
|
13
|
+
- **semantic judgments** (`choose`/`rate`/`verify`/`probability`),
|
|
14
|
+
- **host tools** via `exec/2`, and
|
|
15
|
+
- **model calls** via `task/N` — a bounded agentic turn that may itself call
|
|
16
|
+
other skills.
|
|
17
|
+
|
|
18
|
+
The module is **data = code**: small/medium structured data belongs in it as
|
|
19
|
+
facts (`country(ch, "Switzerland").`), inspected and queried exactly like
|
|
20
|
+
predicates (`listing`, `/goal`, `execute`). Add data as facts when it is small
|
|
21
|
+
enough to reason over; keep large datasets in a file or a linked script rather
|
|
22
|
+
than bloating the module.
|
|
23
|
+
|
|
24
|
+
A harness may also carry **test predicates** that pin the intended behavior of a
|
|
25
|
+
skill — for example `test_<name>`, or a small `check/2` runner over
|
|
26
|
+
input/expected pairs. When you change a skill, update or add its test and run it
|
|
27
|
+
so the change is verified, not assumed.
|
|
28
|
+
|
|
29
|
+
So a harness evolves like a codebase through **composition and reuse**: prefer
|
|
30
|
+
an existing predicate over a near-duplicate. Change it **only when the user
|
|
31
|
+
asks** — create on a fresh workspace, and afterwards touch only what the request
|
|
32
|
+
requires; never refactor or extend it on your own initiative.
|
|
33
|
+
|
|
34
|
+
**Generalize, don't specialize.** Prefer a few small, composable primitives over
|
|
35
|
+
a predicate per request, and express one-off requests by composing them (or a
|
|
36
|
+
direct `/goal`) instead of naming a predicate for every phrasing. A hard-coded
|
|
37
|
+
"latest image in `~/Downloads`" is wrong; even `find_latest(Dir, Pattern, Path)`
|
|
38
|
+
is fairly narrow — the reusable parts (list a directory, filter, pick a
|
|
39
|
+
best/latest element) are shared by many tasks. Ask whether another caller would
|
|
40
|
+
plausibly reuse the predicate with different arguments; if only this request
|
|
41
|
+
would, do not add it. A harness of many task-shaped helpers is as bad as one
|
|
42
|
+
hard-coded script.
|
|
43
|
+
|
|
44
|
+
**Prefer orchestration over algorithms.** A skill should read as a short
|
|
45
|
+
sequence of steps. Describe each step with `task/N` (which sees the conversation
|
|
46
|
+
memory) or `prompt/N` (fresh context) and let the model extract, classify,
|
|
47
|
+
summarise, or decide; keep the Prolog between the steps to simple guards
|
|
48
|
+
(`->`, `;`, `once/1`, `==`, `\==`), `member/2`, `between/3`, `format/2`, and
|
|
49
|
+
small arithmetic. Reach for deep recursion, hand-rolled list algorithms, CLP, or
|
|
50
|
+
`assert`/`retract` only when the task is genuinely algorithmic — and prefer a
|
|
51
|
+
one-shot `execute` goal over committing it as a skill. DML is the orchestration
|
|
52
|
+
layer, not the logic library.
|
|
53
|
+
|
|
54
|
+
## 1. Skills vs one-shot work
|
|
55
|
+
|
|
56
|
+
A harness is a library of reusable **capabilities**, not a record of what you
|
|
57
|
+
did. Most requests mix two things, and you must separate them:
|
|
58
|
+
|
|
59
|
+
- **A reusable capability** — worth a named, documented, tested predicate. It
|
|
60
|
+
takes its inputs as arguments and works for any caller (`describe_image(Path,
|
|
61
|
+
Text)`, `tally(List, Counts)`).
|
|
62
|
+
- **A one-off action** — the concrete step for *this* request. Run it now with
|
|
63
|
+
an `execute` goal or `bash`; do not commit it as a predicate.
|
|
64
|
+
|
|
65
|
+
Example — "find the latest image in `~/Downloads` and tell me what's on it":
|
|
66
|
+
run the "find/copy the latest file" step once in the turn, and add only
|
|
67
|
+
`describe_image(Path, Text)` as the skill. Finding a latest file, copying files
|
|
68
|
+
around, moving data, or any single concrete invocation is a task, not a skill.
|
|
69
|
+
|
|
70
|
+
Never bake environment-specific values into a predicate: no host paths
|
|
71
|
+
(`/home/...`), machine-specific directories, or fixed filenames — a skill takes
|
|
72
|
+
them as arguments. A predicate that exists only to be called once, with literals
|
|
73
|
+
frozen in, is a script in disguise.
|
|
74
|
+
|
|
75
|
+
## 2. Only use tools from the catalog
|
|
76
|
+
|
|
77
|
+
The HOST TOOL CATALOG above is the complete set of `exec(...)` capability tools.
|
|
78
|
+
Do not invent names — there is no `calculator`, `fetch_url`, `web_search`, or
|
|
79
|
+
`vm_exec` unless the catalog lists it. By default the only capability tool is
|
|
80
|
+
**`bash`**.
|
|
81
|
+
|
|
82
|
+
**Prefer the shell for file I/O.** Use `bash` for reading, writing, copying, and
|
|
83
|
+
converting files. The DML file predicates (`read_file/2`, `open/3`,
|
|
84
|
+
`read_string/3`, `write_file/2`, `make_directory_path/1`, `directory_files/2`, …)
|
|
85
|
+
are for when the content must be bound and reasoned over **inside Prolog** — not
|
|
86
|
+
for moving bytes around. Reading a file into DML just to shell it out again is a
|
|
87
|
+
smell.
|
|
88
|
+
|
|
89
|
+
## 3. Scripts are files, linked from the harness
|
|
90
|
+
|
|
91
|
+
Materialize a script by running a DML goal with the `execute` tool — for example
|
|
92
|
+
`make_directory_path("scripts"), write_file("scripts/x.py", "…")` — then link it
|
|
93
|
+
with `script_file/2` and run it with `bash`. `write_file/2` writes to the
|
|
94
|
+
workspace immediately and does **not** create parent directories.
|
|
95
|
+
`script_file/2` is just a fact: it tells `export` which files belong to the
|
|
96
|
+
harness. Use a literal workspace-relative path and one fact per name. `export harness.zip` bundles the
|
|
97
|
+
`.dml` plus every linked file; `export harness.dml` inlines them so the single
|
|
98
|
+
file stays portable.
|
|
99
|
+
|
|
100
|
+
Untrusted data (URLs, file contents, user text) goes through a file or `stdin`,
|
|
101
|
+
never interpolated into the shell command string. See `HARNESS_EXAMPLES.md` §1.
|
|
102
|
+
|
|
103
|
+
A linked script is for a genuinely external capability (a library, `ffmpeg`, an
|
|
104
|
+
API) — not a substitute for a shell command you run once, and not one script per
|
|
105
|
+
request. When a script is the capability, it is a component: parameterize it and
|
|
106
|
+
document it with `doc/2`.
|
|
107
|
+
|
|
108
|
+
## 4. Annotate the harness (self-describing)
|
|
109
|
+
|
|
110
|
+
Keep the harness self-describing. `module_doc/1` is the harness's **skill
|
|
111
|
+
description** — the one line that says what the harness does and when to use it,
|
|
112
|
+
the same role a skill's `description` plays for routing. Write it like
|
|
113
|
+
frontmatter, not like a title:
|
|
114
|
+
|
|
115
|
+
```prolog
|
|
116
|
+
module_doc("Support triage: classify a customer message and route it to the right team. Use when a message needs a team.").
|
|
117
|
+
|
|
118
|
+
doc(classify/2, "Route a support message to a team. classify(+Message, -Team). Example: /goal classify(\"I was charged twice\", T).").
|
|
119
|
+
doc(tally/2, "Count occurrences of each item. tally(+List, -Counts) yields Key-N pairs. Example: tally([a,b,a], C).").
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- `module_doc(Text)` — the skill description. It is the **first line of the
|
|
123
|
+
manifest** (`- skill: ...`), so **read it at the start of the session and
|
|
124
|
+
re-read it whenever the harness changes**. A file with only `module_doc/1` and
|
|
125
|
+
no predicates is still a valid skill: it advertises the capability while the
|
|
126
|
+
body is empty.
|
|
127
|
+
- `tool(Head, "desc") :- Body.` — **an annotation, not an implementation**: it
|
|
128
|
+
exposes an existing predicate to the nested agent in `task/N`. Define the
|
|
129
|
+
predicate normally and delegate
|
|
130
|
+
(`tool(count_words(File, Count), "…") :- count_words(File, Count).`), so the
|
|
131
|
+
same predicate is callable from `execute` / `/goal` **and** from `task/N`. Logic
|
|
132
|
+
placed only inside `tool/2` is unreachable from `execute` (the loader asserts
|
|
133
|
+
`tool(Head)`, never `Head`).
|
|
134
|
+
- `doc(Name/Arity, Text)` — one fact per skill, helper, or tool; terse, with
|
|
135
|
+
arguments (`+in` / `-out`) and an example goal.
|
|
136
|
+
|
|
137
|
+
They are shown in the manifest (so the next turn sees them), in `listing`, and
|
|
138
|
+
survive `export`. When you change a predicate, update its `doc/2`; when the
|
|
139
|
+
harness's purpose changes, update `module_doc/1`.
|
|
140
|
+
|
|
141
|
+
## 5. Media (images)
|
|
142
|
+
|
|
143
|
+
Images are **workspace files**, referenced by `media(Path, Mime)`; the bytes
|
|
144
|
+
never enter Prolog or conversation memory. Read a reference with `read_media/2`
|
|
145
|
+
and put it in context with `attach_media/1`; the next `task/N` sends it to the
|
|
146
|
+
model as an image block:
|
|
147
|
+
|
|
148
|
+
```prolog
|
|
149
|
+
describe_image(Path, Text) :-
|
|
150
|
+
read_media(Path, Image),
|
|
151
|
+
attach_media(Image),
|
|
152
|
+
task("Describe the attached image in one sentence.", Text).
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Only PNG/JPEG/GIF/WebP are accepted. This needs a vision-capable model; keep a
|
|
156
|
+
textual description in memory when it does not. Semantic judgments stay
|
|
157
|
+
text-only — never attach media to them.
|
|
158
|
+
|
|
159
|
+
## 6. Guard rails
|
|
160
|
+
|
|
161
|
+
- Read first: call `listing`.
|
|
162
|
+
- **Paths are workspace-relative and workspace-confined.** Never write
|
|
163
|
+
`/workspace/...` or any absolute path in DML — they are rejected. `size_file/2`,
|
|
164
|
+
`time_file/2`, `read_file/2`, `open/3`, `directory_files/2`, and `read_media/2`
|
|
165
|
+
all take a relative path, and `directory_files/2` returns **bare names**, so
|
|
166
|
+
build one (`atom_concat('images/', Name, Path)`). `bash` sees more of the
|
|
167
|
+
sandbox than DML can — keep that in `bash` and hand DML only relative paths.
|
|
168
|
+
Prefer `bash`/host file tools for file operations; use the DML file predicates
|
|
169
|
+
only for content you must reason over in Prolog.
|
|
170
|
+
- **Side-effecting skills must be deterministic.** Any skill that calls
|
|
171
|
+
`task/N`, `prompt/N`, `exec/2`, `read_media/2`, `attach_media/1`, or writes a
|
|
172
|
+
file must yield exactly one solution with no choicepoint left across the side
|
|
173
|
+
effect (`once/1`, `->`, or a cut). Otherwise backtracking re-runs the model
|
|
174
|
+
call: slow, costly, and a different answer each time.
|
|
175
|
+
- Replace a predicate with `define(head, clauses)` (or `retract` then
|
|
176
|
+
`assert_many`). `assert` appends, so asserting a clause twice duplicates the
|
|
177
|
+
predicate; never patch it clause by clause.
|
|
178
|
+
- Clause order matters: base case before a recursive rule; define a whole
|
|
179
|
+
predicate with `assert_many` (clauses in the order written).
|
|
180
|
+
- Verify after changing a predicate: `listing(Name/Arity)`.
|
|
181
|
+
- Bounded iteration only: finite recursion or an explicit bound. `execute` is
|
|
182
|
+
gas-limited and the turn has a model-call budget, but a single builtin call
|
|
183
|
+
(e.g. an unbounded `label/1`) is not interrupted.
|
|
184
|
+
- **CLP is advanced — use it only for a real constraint problem.** Bound every
|
|
185
|
+
domain (`X ins 0..N`) before `label/1`, prefer `once/1`, and keep the model
|
|
186
|
+
small: an under-specified or unsatisfiable model searches forever, and there
|
|
187
|
+
is no per-goal timeout. Never reach for CLP as a shortcut for arithmetic.
|
|
188
|
+
- `bash` runs in a sandbox. Explore it (`python3 --version`, `pip list`,
|
|
189
|
+
`which jq`) and install a dependency when a skill genuinely needs one;
|
|
190
|
+
installs are sandbox/session-local and do not travel with an exported harness,
|
|
191
|
+
so prefer the standard library.
|
|
192
|
+
- Do **not** use `agent_main` unless the user asks for a `deepclause run` /
|
|
193
|
+
`/dc-run` skill.
|
|
194
|
+
- Media: reference images with `media(Path, Mime)` (`read_media/2` +
|
|
195
|
+
`attach_media/1`); never inline bytes.
|