@husk-ai/sessions 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/dist/chat.d.ts +11 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +2 -0
- package/dist/chat.js.map +1 -0
- package/dist/distill.d.ts +130 -0
- package/dist/distill.d.ts.map +1 -0
- package/dist/distill.js +773 -0
- package/dist/distill.js.map +1 -0
- package/dist/distiller.d.ts +18 -0
- package/dist/distiller.d.ts.map +1 -0
- package/dist/distiller.js +23 -0
- package/dist/distiller.js.map +1 -0
- package/dist/formatter.d.ts +8 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +11 -0
- package/dist/formatter.js.map +1 -0
- package/dist/importers/chatgpt.d.ts +12 -0
- package/dist/importers/chatgpt.d.ts.map +1 -0
- package/dist/importers/chatgpt.js +223 -0
- package/dist/importers/chatgpt.js.map +1 -0
- package/dist/importers/claude.d.ts +37 -0
- package/dist/importers/claude.d.ts.map +1 -0
- package/dist/importers/claude.js +512 -0
- package/dist/importers/claude.js.map +1 -0
- package/dist/importers/cursor.d.ts +12 -0
- package/dist/importers/cursor.d.ts.map +1 -0
- package/dist/importers/cursor.js +229 -0
- package/dist/importers/cursor.js.map +1 -0
- package/dist/importers/fsutil.d.ts +22 -0
- package/dist/importers/fsutil.d.ts.map +1 -0
- package/dist/importers/fsutil.js +79 -0
- package/dist/importers/fsutil.js.map +1 -0
- package/dist/importers/gemini.d.ts +13 -0
- package/dist/importers/gemini.d.ts.map +1 -0
- package/dist/importers/gemini.js +228 -0
- package/dist/importers/gemini.js.map +1 -0
- package/dist/importers/index.d.ts +70 -0
- package/dist/importers/index.d.ts.map +1 -0
- package/dist/importers/index.js +258 -0
- package/dist/importers/index.js.map +1 -0
- package/dist/importers/markdown.d.ts +14 -0
- package/dist/importers/markdown.d.ts.map +1 -0
- package/dist/importers/markdown.js +188 -0
- package/dist/importers/markdown.js.map +1 -0
- package/dist/importers/universal.d.ts +16 -0
- package/dist/importers/universal.d.ts.map +1 -0
- package/dist/importers/universal.js +106 -0
- package/dist/importers/universal.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +151 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +109 -0
- package/dist/prompts.js.map +1 -0
- package/dist/redactor.d.ts +38 -0
- package/dist/redactor.d.ts.map +1 -0
- package/dist/redactor.js +144 -0
- package/dist/redactor.js.map +1 -0
- package/dist/scaffold.d.ts +40 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +0 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/serialize.d.ts +15 -0
- package/dist/serialize.d.ts.map +1 -0
- package/dist/serialize.js +122 -0
- package/dist/serialize.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness scaffolding.
|
|
3
|
+
*
|
|
4
|
+
* A Claude Code JSONL is an event log, and the harness injects its own plumbing
|
|
5
|
+
* into it wearing a real role. Background-task notifications, system reminders,
|
|
6
|
+
* slash-command echoes and CI events all arrive as `type: "user"` lines. They
|
|
7
|
+
* are not turns. Left in place they end up in a husk's system prompt, which is
|
|
8
|
+
* the single worst place to put noise.
|
|
9
|
+
*
|
|
10
|
+
* Two treatments, because the tags are not all the same shape:
|
|
11
|
+
*
|
|
12
|
+
* DROP the tag and its body are both plumbing. Remove the whole block.
|
|
13
|
+
* UNWRAP the tag is plumbing but the body is a real message the user sent
|
|
14
|
+
* through a bridge. Remove the markup, keep the words.
|
|
15
|
+
*
|
|
16
|
+
* The stripping is deliberately conservative. A user pasting `<system-reminder>`
|
|
17
|
+
* inside a fenced code block is talking *about* the tag, and that is real user
|
|
18
|
+
* content -- so fenced blocks and inline code spans are masked out before any
|
|
19
|
+
* pattern runs and restored afterwards.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Remove harness plumbing from one message's text.
|
|
23
|
+
*
|
|
24
|
+
* Returns '' when the message was nothing but plumbing, which is the caller's
|
|
25
|
+
* signal to drop the message rather than emit an empty turn.
|
|
26
|
+
*/
|
|
27
|
+
export declare function stripScaffolding(text: string): string;
|
|
28
|
+
/** True when the message carried nothing but harness plumbing. */
|
|
29
|
+
export declare function isScaffoldingOnly(text: string): boolean;
|
|
30
|
+
/** True when the text carries a harness id, a tool-use id or an ephemeral path. */
|
|
31
|
+
export declare function containsHarnessArtifact(text: string): boolean;
|
|
32
|
+
export declare function looksLikeStatusReport(text: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Share of the text that is angle-bracket markup, ignoring fenced code.
|
|
35
|
+
*
|
|
36
|
+
* Fenced blocks are excluded so that a user pasting a component or an XML
|
|
37
|
+
* sample is not mistaken for a machine dump.
|
|
38
|
+
*/
|
|
39
|
+
export declare function markupRatio(text: string): number;
|
|
40
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA+FH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBrD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAsBD,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAcD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD"}
|
package/dist/scaffold.js
ADDED
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HuskSpec } from '@husk-ai/core';
|
|
2
|
+
export interface SerializeOptions {
|
|
3
|
+
/** Header comment. Pass null for no header. */
|
|
4
|
+
header?: string | null;
|
|
5
|
+
/** Name the transcript this husk came from, in the header. */
|
|
6
|
+
sourceLabel?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function stringifySpec(spec: HuskSpec, opts?: SerializeOptions): string;
|
|
9
|
+
/** Parse a husk.yaml string. Throws a HuskError with the YAML position on failure. */
|
|
10
|
+
export declare function parseSpecYaml(text: string, origin?: string): HuskSpec;
|
|
11
|
+
export declare function readSpec(filePath: string): Promise<HuskSpec>;
|
|
12
|
+
export declare function writeSpec(filePath: string, spec: HuskSpec, opts?: SerializeOptions): Promise<string>;
|
|
13
|
+
/** Escape hatch for callers that want raw YAML with the same house style. */
|
|
14
|
+
export declare function toYaml(value: unknown): string;
|
|
15
|
+
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAkC9C,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,gBAAqB,GAAG,MAAM,CAIjF;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAc,GAAG,QAAQ,CAiB1E;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAWlE;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE7C"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { Document, parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
4
|
+
import { HuskError, parseSpec } from '@husk-ai/core';
|
|
5
|
+
/**
|
|
6
|
+
* husk.yaml on disk.
|
|
7
|
+
*
|
|
8
|
+
* The file is meant to be opened, read and edited by a person, so the key order
|
|
9
|
+
* is deliberate -- who the bot is, then what it knows, then what it may do --
|
|
10
|
+
* and multi-line strings are literal blocks instead of one long quoted line.
|
|
11
|
+
* No anchors: a `&persona` reference saves bytes and costs a reader a minute.
|
|
12
|
+
*/
|
|
13
|
+
/** Identity first, then behaviour, then capability, then policy. */
|
|
14
|
+
const KEY_ORDER = [
|
|
15
|
+
'apiVersion',
|
|
16
|
+
'name',
|
|
17
|
+
'displayName',
|
|
18
|
+
'version',
|
|
19
|
+
'description',
|
|
20
|
+
'model',
|
|
21
|
+
'fallbackModels',
|
|
22
|
+
'temperature',
|
|
23
|
+
'persona',
|
|
24
|
+
'knowledge',
|
|
25
|
+
'examples',
|
|
26
|
+
'tools',
|
|
27
|
+
'computer',
|
|
28
|
+
'limits',
|
|
29
|
+
'guardrails',
|
|
30
|
+
'memory',
|
|
31
|
+
'triggers',
|
|
32
|
+
'metadata',
|
|
33
|
+
'origin',
|
|
34
|
+
];
|
|
35
|
+
function ordered(spec) {
|
|
36
|
+
const src = spec;
|
|
37
|
+
const out = {};
|
|
38
|
+
for (const key of KEY_ORDER) {
|
|
39
|
+
const v = src[key];
|
|
40
|
+
if (v !== undefined)
|
|
41
|
+
out[key] = v;
|
|
42
|
+
}
|
|
43
|
+
// Anything the schema grows later still gets written.
|
|
44
|
+
for (const [k, v] of Object.entries(src))
|
|
45
|
+
if (!(k in out) && v !== undefined)
|
|
46
|
+
out[k] = v;
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
function defaultHeader(spec, sourceLabel) {
|
|
50
|
+
const lines = [
|
|
51
|
+
` ${spec.displayName ?? spec.name} -- a husk.`,
|
|
52
|
+
` Generated by @husk-ai/sessions. Edit freely; this file is the whole bot.`,
|
|
53
|
+
];
|
|
54
|
+
const label = sourceLabel ?? spec.origin?.source;
|
|
55
|
+
if (label)
|
|
56
|
+
lines.push(` Distilled from: ${label}`);
|
|
57
|
+
if (spec.origin?.messageCount !== undefined)
|
|
58
|
+
lines.push(` Messages read: ${spec.origin.messageCount}`);
|
|
59
|
+
if (spec.origin?.importedAt)
|
|
60
|
+
lines.push(` Imported: ${spec.origin.importedAt}`);
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
const YAML_OPTIONS = {
|
|
64
|
+
// Never fold: a folded persona is a persona nobody can diff.
|
|
65
|
+
lineWidth: 0,
|
|
66
|
+
// Force literal blocks for anything containing a newline.
|
|
67
|
+
blockQuote: 'literal',
|
|
68
|
+
// No `&anchor` / `*alias`.
|
|
69
|
+
aliasDuplicateObjects: false,
|
|
70
|
+
indent: 2,
|
|
71
|
+
nullStr: '',
|
|
72
|
+
};
|
|
73
|
+
export function stringifySpec(spec, opts = {}) {
|
|
74
|
+
const doc = new Document(ordered(spec));
|
|
75
|
+
if (opts.header !== null)
|
|
76
|
+
doc.commentBefore = opts.header ?? defaultHeader(spec, opts.sourceLabel);
|
|
77
|
+
return doc.toString(YAML_OPTIONS);
|
|
78
|
+
}
|
|
79
|
+
/** Parse a husk.yaml string. Throws a HuskError with the YAML position on failure. */
|
|
80
|
+
export function parseSpecYaml(text, origin = 'husk.yaml') {
|
|
81
|
+
let data;
|
|
82
|
+
try {
|
|
83
|
+
data = parseYaml(text);
|
|
84
|
+
}
|
|
85
|
+
catch (cause) {
|
|
86
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
87
|
+
throw new HuskError('E_SPEC_INVALID', `${origin} is not valid YAML: ${message}`, {
|
|
88
|
+
hint: 'Check indentation, and that any string with a colon in it is quoted.',
|
|
89
|
+
cause,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (data === null || data === undefined) {
|
|
93
|
+
throw new HuskError('E_SPEC_INVALID', `${origin} is empty.`, {
|
|
94
|
+
hint: 'Run `husk init` to write a starting husk.yaml.',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return parseSpec(data);
|
|
98
|
+
}
|
|
99
|
+
export async function readSpec(filePath) {
|
|
100
|
+
let text;
|
|
101
|
+
try {
|
|
102
|
+
text = await readFile(filePath, 'utf8');
|
|
103
|
+
}
|
|
104
|
+
catch (cause) {
|
|
105
|
+
throw new HuskError('E_SPEC_INVALID', `Cannot read ${filePath}.`, {
|
|
106
|
+
hint: 'Check the path, or run `husk init` to create one.',
|
|
107
|
+
cause,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return parseSpecYaml(text, filePath);
|
|
111
|
+
}
|
|
112
|
+
export async function writeSpec(filePath, spec, opts = {}) {
|
|
113
|
+
const text = stringifySpec(spec, opts);
|
|
114
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
115
|
+
await writeFile(filePath, text, 'utf8');
|
|
116
|
+
return text;
|
|
117
|
+
}
|
|
118
|
+
/** Escape hatch for callers that want raw YAML with the same house style. */
|
|
119
|
+
export function toYaml(value) {
|
|
120
|
+
return stringifyYaml(value, YAML_OPTIONS);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=serialize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../src/serialize.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@husk-ai/sessions",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Transcript importers and the distiller that turns a chat into a husk.yaml.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -p tsconfig.build.json",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
21
|
+
"test": "vitest run --passWithNoTests"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@husk-ai/core": "0.1.1",
|
|
25
|
+
"yaml": "^2.9.0",
|
|
26
|
+
"zod": "^3.23.8"
|
|
27
|
+
}
|
|
28
|
+
}
|