sourceloop 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 +401 -0
- package/dist/commands/attach.d.ts +2 -0
- package/dist/commands/attach.js +103 -0
- package/dist/commands/attach.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +33 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/chrome.d.ts +2 -0
- package/dist/commands/chrome.js +30 -0
- package/dist/commands/chrome.js.map +1 -0
- package/dist/commands/compose.d.ts +2 -0
- package/dist/commands/compose.js +14 -0
- package/dist/commands/compose.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +15 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/import-latest.d.ts +2 -0
- package/dist/commands/import-latest.js +42 -0
- package/dist/commands/import-latest.js.map +1 -0
- package/dist/commands/ingest.d.ts +2 -0
- package/dist/commands/ingest.js +14 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +24 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/notebook-bind.d.ts +2 -0
- package/dist/commands/notebook-bind.js +39 -0
- package/dist/commands/notebook-bind.js.map +1 -0
- package/dist/commands/notebook-create.d.ts +2 -0
- package/dist/commands/notebook-create.js +39 -0
- package/dist/commands/notebook-create.js.map +1 -0
- package/dist/commands/notebook-import.d.ts +2 -0
- package/dist/commands/notebook-import.js +39 -0
- package/dist/commands/notebook-import.js.map +1 -0
- package/dist/commands/notebook-source.d.ts +2 -0
- package/dist/commands/notebook-source.js +71 -0
- package/dist/commands/notebook-source.js.map +1 -0
- package/dist/commands/plan.d.ts +9 -0
- package/dist/commands/plan.js +59 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.js +76 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.js +15 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/topic.d.ts +2 -0
- package/dist/commands/topic.js +53 -0
- package/dist/commands/topic.js.map +1 -0
- package/dist/core/attach/launch-managed-chrome.d.ts +27 -0
- package/dist/core/attach/launch-managed-chrome.js +136 -0
- package/dist/core/attach/launch-managed-chrome.js.map +1 -0
- package/dist/core/attach/manage-targets.d.ts +49 -0
- package/dist/core/attach/manage-targets.js +179 -0
- package/dist/core/attach/manage-targets.js.map +1 -0
- package/dist/core/ingest/frontmatter.d.ts +4 -0
- package/dist/core/ingest/frontmatter.js +30 -0
- package/dist/core/ingest/frontmatter.js.map +1 -0
- package/dist/core/ingest/html-to-markdown.d.ts +5 -0
- package/dist/core/ingest/html-to-markdown.js +53 -0
- package/dist/core/ingest/html-to-markdown.js.map +1 -0
- package/dist/core/ingest/ingest-source.d.ts +11 -0
- package/dist/core/ingest/ingest-source.js +115 -0
- package/dist/core/ingest/ingest-source.js.map +1 -0
- package/dist/core/notebooklm/adapter.d.ts +17 -0
- package/dist/core/notebooklm/adapter.js +2 -0
- package/dist/core/notebooklm/adapter.js.map +1 -0
- package/dist/core/notebooklm/auth.d.ts +30 -0
- package/dist/core/notebooklm/auth.js +105 -0
- package/dist/core/notebooklm/auth.js.map +1 -0
- package/dist/core/notebooklm/browser-agent-adapter.d.ts +21 -0
- package/dist/core/notebooklm/browser-agent-adapter.js +37 -0
- package/dist/core/notebooklm/browser-agent-adapter.js.map +1 -0
- package/dist/core/notebooklm/browser-agent.d.ts +121 -0
- package/dist/core/notebooklm/browser-agent.js +1604 -0
- package/dist/core/notebooklm/browser-agent.js.map +1 -0
- package/dist/core/notebooklm/config.d.ts +20 -0
- package/dist/core/notebooklm/config.js +133 -0
- package/dist/core/notebooklm/config.js.map +1 -0
- package/dist/core/notebooklm/fixture-adapter.d.ts +13 -0
- package/dist/core/notebooklm/fixture-adapter.js +32 -0
- package/dist/core/notebooklm/fixture-adapter.js.map +1 -0
- package/dist/core/notebooklm/response-extraction.d.ts +23 -0
- package/dist/core/notebooklm/response-extraction.js +348 -0
- package/dist/core/notebooklm/response-extraction.js.map +1 -0
- package/dist/core/notebooks/bind-notebook.d.ts +21 -0
- package/dist/core/notebooks/bind-notebook.js +95 -0
- package/dist/core/notebooks/bind-notebook.js.map +1 -0
- package/dist/core/notebooks/manage-managed-notebooks.d.ts +70 -0
- package/dist/core/notebooks/manage-managed-notebooks.js +491 -0
- package/dist/core/notebooks/manage-managed-notebooks.js.map +1 -0
- package/dist/core/notebooks/manage-notebook-source-manifests.d.ts +25 -0
- package/dist/core/notebooks/manage-notebook-source-manifests.js +127 -0
- package/dist/core/notebooks/manage-notebook-source-manifests.js.map +1 -0
- package/dist/core/operator/workspace-operator.d.ts +82 -0
- package/dist/core/operator/workspace-operator.js +610 -0
- package/dist/core/operator/workspace-operator.js.map +1 -0
- package/dist/core/outputs/compose-run.d.ts +11 -0
- package/dist/core/outputs/compose-run.js +98 -0
- package/dist/core/outputs/compose-run.js.map +1 -0
- package/dist/core/runs/load-artifacts.d.ts +14 -0
- package/dist/core/runs/load-artifacts.js +51 -0
- package/dist/core/runs/load-artifacts.js.map +1 -0
- package/dist/core/runs/question-planner.d.ts +20 -0
- package/dist/core/runs/question-planner.js +276 -0
- package/dist/core/runs/question-planner.js.map +1 -0
- package/dist/core/runs/render-run-note.d.ts +13 -0
- package/dist/core/runs/render-run-note.js +111 -0
- package/dist/core/runs/render-run-note.js.map +1 -0
- package/dist/core/runs/run-qa.d.ts +28 -0
- package/dist/core/runs/run-qa.js +393 -0
- package/dist/core/runs/run-qa.js.map +1 -0
- package/dist/core/topics/manage-topics.d.ts +27 -0
- package/dist/core/topics/manage-topics.js +314 -0
- package/dist/core/topics/manage-topics.js.map +1 -0
- package/dist/core/vault/notes.d.ts +29 -0
- package/dist/core/vault/notes.js +147 -0
- package/dist/core/vault/notes.js.map +1 -0
- package/dist/core/vault/paths.d.ts +31 -0
- package/dist/core/vault/paths.js +44 -0
- package/dist/core/vault/paths.js.map +1 -0
- package/dist/core/workspace/bootstrap.d.ts +16 -0
- package/dist/core/workspace/bootstrap.js +443 -0
- package/dist/core/workspace/bootstrap.js.map +1 -0
- package/dist/core/workspace/constants.d.ts +3 -0
- package/dist/core/workspace/constants.js +16 -0
- package/dist/core/workspace/constants.js.map +1 -0
- package/dist/core/workspace/init-workspace.d.ts +15 -0
- package/dist/core/workspace/init-workspace.js +86 -0
- package/dist/core/workspace/init-workspace.js.map +1 -0
- package/dist/core/workspace/load-workspace.d.ts +6 -0
- package/dist/core/workspace/load-workspace.js +51 -0
- package/dist/core/workspace/load-workspace.js.map +1 -0
- package/dist/core/workspace/schema.d.ts +19 -0
- package/dist/core/workspace/schema.js +19 -0
- package/dist/core/workspace/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cli-output.d.ts +2 -0
- package/dist/lib/cli-output.js +7 -0
- package/dist/lib/cli-output.js.map +1 -0
- package/dist/lib/obsidian.d.ts +4 -0
- package/dist/lib/obsidian.js +23 -0
- package/dist/lib/obsidian.js.map +1 -0
- package/dist/lib/slugify.d.ts +1 -0
- package/dist/lib/slugify.js +10 -0
- package/dist/lib/slugify.js.map +1 -0
- package/dist/lib/write-json.d.ts +1 -0
- package/dist/lib/write-json.js +5 -0
- package/dist/lib/write-json.js.map +1 -0
- package/dist/schemas/attach.d.ts +118 -0
- package/dist/schemas/attach.js +33 -0
- package/dist/schemas/attach.js.map +1 -0
- package/dist/schemas/managed-notebook.d.ts +47 -0
- package/dist/schemas/managed-notebook.js +30 -0
- package/dist/schemas/managed-notebook.js.map +1 -0
- package/dist/schemas/notebook-source.d.ts +31 -0
- package/dist/schemas/notebook-source.js +23 -0
- package/dist/schemas/notebook-source.js.map +1 -0
- package/dist/schemas/notebook.d.ts +26 -0
- package/dist/schemas/notebook.js +18 -0
- package/dist/schemas/notebook.js.map +1 -0
- package/dist/schemas/run.d.ts +169 -0
- package/dist/schemas/run.js +80 -0
- package/dist/schemas/run.js.map +1 -0
- package/dist/schemas/source.d.ts +18 -0
- package/dist/schemas/source.js +13 -0
- package/dist/schemas/source.js.map +1 -0
- package/dist/schemas/topic.d.ts +37 -0
- package/dist/schemas/topic.js +25 -0
- package/dist/schemas/topic.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { loadChromeAttachTarget } from "../core/attach/manage-targets.js";
|
|
3
|
+
import { loadNotebookBinding, loadQuestionBatch } from "../core/runs/load-artifacts.js";
|
|
4
|
+
import { defaultNotebookBrowserSessionFactory } from "../core/notebooklm/browser-agent.js";
|
|
5
|
+
import { importLatestAnswerIntoRun } from "../core/runs/run-qa.js";
|
|
6
|
+
export const importLatestCommand = new Command("import-latest")
|
|
7
|
+
.description("Import the latest visible NotebookLM answer into an existing planned run")
|
|
8
|
+
.argument("<run-id>", "run id to import into")
|
|
9
|
+
.option("--question-id <question-id>", "planned question id to attach this imported answer to")
|
|
10
|
+
.option("--attach-target <target-id>", "override the notebook binding attach target")
|
|
11
|
+
.option("--show-browser", "show Chrome while attaching to NotebookLM", false)
|
|
12
|
+
.action(async (runId, options) => {
|
|
13
|
+
const { run } = await loadQuestionBatch(runId);
|
|
14
|
+
const { binding } = await loadNotebookBinding(run.notebookBindingId);
|
|
15
|
+
const attachTargetId = options.attachTarget ?? binding.attachTargetId;
|
|
16
|
+
if (!attachTargetId) {
|
|
17
|
+
throw new Error(`Run ${runId} does not have an attached Chrome target. Re-run with --attach-target <target-id> or bind the notebook with --attach-target.`);
|
|
18
|
+
}
|
|
19
|
+
const { target } = await loadChromeAttachTarget(attachTargetId);
|
|
20
|
+
const session = await defaultNotebookBrowserSessionFactory.createSession({
|
|
21
|
+
target,
|
|
22
|
+
showBrowser: options.showBrowser,
|
|
23
|
+
reuseExistingNotebookPage: true
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
await session.preflight(binding.notebookUrl);
|
|
27
|
+
const latestAnswer = await session.captureLatestAnswer();
|
|
28
|
+
const result = await importLatestAnswerIntoRun({
|
|
29
|
+
runId,
|
|
30
|
+
answer: {
|
|
31
|
+
...latestAnswer,
|
|
32
|
+
answerSource: "notebooklm"
|
|
33
|
+
},
|
|
34
|
+
...(options.questionId ? { questionId: options.questionId } : {})
|
|
35
|
+
});
|
|
36
|
+
process.stdout.write(`Imported latest NotebookLM answer into ${result.importedQuestionId} (${result.run.status})\n`);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
await session.close();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=import-latest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-latest.js","sourceRoot":"","sources":["../../src/commands/import-latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,0EAA0E,CAAC;KACvF,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,6BAA6B,EAAE,uDAAuD,CAAC;KAC9F,MAAM,CAAC,6BAA6B,EAAE,6CAA6C,CAAC;KACpF,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAC5E,MAAM,CACL,KAAK,EACH,KAAa,EACb,OAIC,EACD,EAAE;IACF,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC;IAEtE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,OAAO,KAAK,8HAA8H,CAC3I,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,MAAM,oCAAoC,CAAC,aAAa,CAAC;QACvE,MAAM;QACN,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,yBAAyB,EAAE,IAAI;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC;YAC7C,KAAK;YACL,MAAM,EAAE;gBACN,GAAG,YAAY;gBACf,YAAY,EAAE,YAAY;aAC3B;YACD,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClE,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0CAA0C,MAAM,CAAC,kBAAkB,KAAK,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAC/F,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ingestSource } from "../core/ingest/ingest-source.js";
|
|
3
|
+
export const ingestCommand = new Command("ingest")
|
|
4
|
+
.description("Ingest a local file or URL into the current SourceLoop workspace")
|
|
5
|
+
.argument("<input>", "file path or URL to ingest")
|
|
6
|
+
.option("--topic <topic-id>", "topic to attach this source to")
|
|
7
|
+
.action(async (input, options) => {
|
|
8
|
+
const result = await ingestSource({
|
|
9
|
+
input,
|
|
10
|
+
...(options.topic ? { topicId: options.topic } : {})
|
|
11
|
+
});
|
|
12
|
+
process.stdout.write(`Ingested ${result.source.type} source into ${result.outputPath}\n`);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,kEAAkE,CAAC;KAC/E,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;KACjD,MAAM,CAAC,oBAAoB,EAAE,gCAAgC,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA2B,EAAE,EAAE;IAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,gBAAgB,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAC5F,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Command, Option } from "commander";
|
|
2
|
+
import { initializeWorkspace } from "../core/workspace/init-workspace.js";
|
|
3
|
+
import { SUPPORTED_AGENT_BOOTSTRAPS } from "../core/workspace/bootstrap.js";
|
|
4
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
5
|
+
export const initCommand = new Command("init")
|
|
6
|
+
.description("Initialize a SourceLoop workspace in the target directory")
|
|
7
|
+
.argument("[directory]", "target directory to initialize", ".")
|
|
8
|
+
.addOption(new Option("--ai <target>", "generate a project-local AI operator bootstrap")
|
|
9
|
+
.choices(SUPPORTED_AGENT_BOOTSTRAPS))
|
|
10
|
+
.option("--force", "overwrite an existing SourceLoop config file", false)
|
|
11
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
12
|
+
.action(async (directory, options) => {
|
|
13
|
+
const result = await initializeWorkspace({
|
|
14
|
+
directory,
|
|
15
|
+
force: options.force,
|
|
16
|
+
...(options.ai ? { ai: options.ai } : {})
|
|
17
|
+
});
|
|
18
|
+
if (options.json) {
|
|
19
|
+
writeJsonOutput(result);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
writeTextOutput(result.message);
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAgC,MAAM,gCAAgC,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2DAA2D,CAAC;KACxE,QAAQ,CAAC,aAAa,EAAE,gCAAgC,EAAE,GAAG,CAAC;KAC9D,SAAS,CACR,IAAI,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;KAC1E,OAAO,CAAC,0BAAiD,CAAC,CAC9D;KACA,MAAM,CAAC,SAAS,EAAE,8CAA8C,EAAE,KAAK,CAAC;KACxE,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,OAAwE,EAAE,EAAE;IAC5G,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACvC,SAAS;QACT,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { bindNotebook } from "../core/notebooks/bind-notebook.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const notebookBindCommand = new Command("notebook-bind")
|
|
5
|
+
.description("Create a notebook binding record for a NotebookLM target")
|
|
6
|
+
.requiredOption("--name <name>", "binding display name")
|
|
7
|
+
.option("--topic <topic>", "legacy freeform research topic for the notebook")
|
|
8
|
+
.option("--topic-id <topic-id>", "topic id for the preferred topic-first workflow")
|
|
9
|
+
.requiredOption("--url <url>", "NotebookLM notebook URL")
|
|
10
|
+
.option("--access <mode>", "notebook access mode", "owner")
|
|
11
|
+
.option("--force", "overwrite an existing binding with the same id", false)
|
|
12
|
+
.option("--description <description>", "description of the notebook contents")
|
|
13
|
+
.option("--topics <topics>", "comma-separated notebook topics")
|
|
14
|
+
.option("--attach-target <target-id>", "default attached Chrome target for this notebook")
|
|
15
|
+
.option("--browser-profile <profile>", "browser profile alias for this binding")
|
|
16
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
if (!options.topicId && !options.topic) {
|
|
19
|
+
throw new Error("Provide --topic-id for the preferred topic-first flow or --topic for the legacy notebook-first flow.");
|
|
20
|
+
}
|
|
21
|
+
const result = await bindNotebook({
|
|
22
|
+
name: options.name,
|
|
23
|
+
topic: options.topic ?? options.topicId ?? options.name,
|
|
24
|
+
notebookUrl: options.url,
|
|
25
|
+
accessMode: options.access,
|
|
26
|
+
force: options.force,
|
|
27
|
+
topics: options.topics?.split(",").map((topic) => topic.trim()).filter(Boolean) ?? [],
|
|
28
|
+
...(options.description ? { description: options.description } : {}),
|
|
29
|
+
...(options.topicId ? { topicId: options.topicId } : {}),
|
|
30
|
+
...(options.attachTarget ? { attachTargetId: options.attachTarget } : {}),
|
|
31
|
+
...(options.browserProfile ? { browserProfile: options.browserProfile } : {})
|
|
32
|
+
});
|
|
33
|
+
if (options.json) {
|
|
34
|
+
writeJsonOutput(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
writeTextOutput(`Bound notebook ${result.binding.id} at ${result.markdownPath}`);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=notebook-bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-bind.js","sourceRoot":"","sources":["../../src/commands/notebook-bind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,CAAC,eAAe,CAAC;KAC5D,WAAW,CAAC,0DAA0D,CAAC;KACvE,cAAc,CAAC,eAAe,EAAE,sBAAsB,CAAC;KACvD,MAAM,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;KAC5E,MAAM,CAAC,uBAAuB,EAAE,iDAAiD,CAAC;KAClF,cAAc,CAAC,aAAa,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,OAAO,CAAC;KAC1D,MAAM,CAAC,SAAS,EAAE,gDAAgD,EAAE,KAAK,CAAC;KAC1E,MAAM,CAAC,6BAA6B,EAAE,sCAAsC,CAAC;KAC7E,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;KAC9D,MAAM,CAAC,6BAA6B,EAAE,kDAAkD,CAAC;KACzF,MAAM,CAAC,6BAA6B,EAAE,wCAAwC,CAAC;KAC/E,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CACL,KAAK,EAAE,OAYN,EAAE,EAAE;IACH,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;IAC1H,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI;QACvD,WAAW,EAAE,OAAO,CAAC,GAAG;QACxB,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;QACrF,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;AACnF,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createManagedNotebook } from "../core/notebooks/manage-managed-notebooks.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const notebookCreateCommand = new Command("notebook-create")
|
|
5
|
+
.description("Create a fresh NotebookLM notebook through an attached Chrome session")
|
|
6
|
+
.requiredOption("--name <name>", "notebook display name")
|
|
7
|
+
.requiredOption("--topic-id <topic-id>", "topic id")
|
|
8
|
+
.requiredOption("--attach-target <target-id>", "attached Chrome target id")
|
|
9
|
+
.option("--access <mode>", "notebook access mode", "owner")
|
|
10
|
+
.option("--description <description>", "description of the notebook contents")
|
|
11
|
+
.option("--topics <topics>", "comma-separated notebook tags")
|
|
12
|
+
.option("--force", "overwrite an existing managed setup with the same id", false)
|
|
13
|
+
.option("--show-browser", "show the attached browser while creating the notebook", false)
|
|
14
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
const result = await createManagedNotebook({
|
|
17
|
+
name: options.name,
|
|
18
|
+
topicId: options.topicId,
|
|
19
|
+
attachTargetId: options.attachTarget,
|
|
20
|
+
accessMode: options.access,
|
|
21
|
+
...(options.description ? { description: options.description } : {}),
|
|
22
|
+
...(options.topics
|
|
23
|
+
? {
|
|
24
|
+
topics: options.topics
|
|
25
|
+
.split(",")
|
|
26
|
+
.map((value) => value.trim())
|
|
27
|
+
.filter(Boolean)
|
|
28
|
+
}
|
|
29
|
+
: {}),
|
|
30
|
+
force: options.force,
|
|
31
|
+
showBrowser: options.showBrowser
|
|
32
|
+
});
|
|
33
|
+
if (options.json) {
|
|
34
|
+
writeJsonOutput(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
writeTextOutput(`Created managed notebook ${result.binding.id} at ${result.bindingMarkdownPath}`);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=notebook-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-create.js","sourceRoot":"","sources":["../../src/commands/notebook-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC;KAChE,WAAW,CAAC,uEAAuE,CAAC;KACpF,cAAc,CAAC,eAAe,EAAE,uBAAuB,CAAC;KACxD,cAAc,CAAC,uBAAuB,EAAE,UAAU,CAAC;KACnD,cAAc,CAAC,6BAA6B,EAAE,2BAA2B,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,EAAE,OAAO,CAAC;KAC1D,MAAM,CAAC,6BAA6B,EAAE,sCAAsC,CAAC;KAC7E,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;KAC5D,MAAM,CAAC,SAAS,EAAE,sDAAsD,EAAE,KAAK,CAAC;KAChF,MAAM,CAAC,gBAAgB,EAAE,uDAAuD,EAAE,KAAK,CAAC;KACxF,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CACL,KAAK,EAAE,OAUN,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC;QACzC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,cAAc,EAAE,OAAO,CAAC,YAAY;QACpC,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,OAAO,CAAC,MAAM;YAChB,CAAC,CAAC;gBACE,MAAM,EAAE,OAAO,CAAC,MAAM;qBACnB,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;qBAC5B,MAAM,CAAC,OAAO,CAAC;aACnB;YACH,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,4BAA4B,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACpG,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { importIntoManagedNotebook } from "../core/notebooks/manage-managed-notebooks.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const notebookImportCommand = new Command("notebook-import")
|
|
5
|
+
.description("Import a local SourceLoop source or remote URL into a managed NotebookLM notebook")
|
|
6
|
+
.requiredOption("--notebook <binding-id>", "managed notebook binding id")
|
|
7
|
+
.option("--source-id <source-id>", "existing SourceLoop source artifact id")
|
|
8
|
+
.option("--url <url>", "remote URL to import")
|
|
9
|
+
.option("--title <title>", "override import title")
|
|
10
|
+
.option("--force", "overwrite an existing managed import with the same id", false)
|
|
11
|
+
.option("--show-browser", "show the attached browser while importing", false)
|
|
12
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
const sourceModes = [options.sourceId ? "sourceId" : undefined, options.url ? "url" : undefined].filter(Boolean);
|
|
15
|
+
if (sourceModes.length !== 1) {
|
|
16
|
+
throw new Error("Provide exactly one of --source-id or --url.");
|
|
17
|
+
}
|
|
18
|
+
const result = await importIntoManagedNotebook(options.sourceId
|
|
19
|
+
? {
|
|
20
|
+
notebookBindingId: options.notebook,
|
|
21
|
+
sourceId: options.sourceId,
|
|
22
|
+
...(options.title ? { title: options.title } : {}),
|
|
23
|
+
force: options.force,
|
|
24
|
+
showBrowser: options.showBrowser
|
|
25
|
+
}
|
|
26
|
+
: {
|
|
27
|
+
notebookBindingId: options.notebook,
|
|
28
|
+
url: options.url,
|
|
29
|
+
...(options.title ? { title: options.title } : {}),
|
|
30
|
+
force: options.force,
|
|
31
|
+
showBrowser: options.showBrowser
|
|
32
|
+
});
|
|
33
|
+
if (options.json) {
|
|
34
|
+
writeJsonOutput(result);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
writeTextOutput(`Imported ${result.managedImport.sourceUri} into ${result.managedImport.notebookBindingId} (${result.managedImport.status})`);
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=notebook-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-import.js","sourceRoot":"","sources":["../../src/commands/notebook-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,+CAA+C,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC;KAChE,WAAW,CAAC,mFAAmF,CAAC;KAChG,cAAc,CAAC,yBAAyB,EAAE,6BAA6B,CAAC;KACxE,MAAM,CAAC,yBAAyB,EAAE,wCAAwC,CAAC;KAC3E,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KAClD,MAAM,CAAC,SAAS,EAAE,uDAAuD,EAAE,KAAK,CAAC;KACjF,MAAM,CAAC,gBAAgB,EAAE,2CAA2C,EAAE,KAAK,CAAC;KAC5E,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CACL,KAAK,EAAE,OAQN,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAC5C,OAAO,CAAC,QAAQ;QACd,CAAC,CAAC;YACE,iBAAiB,EAAE,OAAO,CAAC,QAAQ;YACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC;QACH,CAAC,CAAC;YACE,iBAAiB,EAAE,OAAO,CAAC,QAAQ;YACnC,GAAG,EAAE,OAAO,CAAC,GAAI;YACjB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CACN,CAAC;IAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,YAAY,MAAM,CAAC,aAAa,CAAC,SAAS,SAAS,MAAM,CAAC,aAAa,CAAC,iBAAiB,KAAK,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AAChJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { declareNotebookSourceManifest, listNotebookSourceManifests, loadNotebookSourceManifest } from "../core/notebooks/manage-notebook-source-manifests.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const notebookSourceCommand = new Command("notebook-source").description("Declare and inspect NotebookLM-backed source manifests");
|
|
5
|
+
notebookSourceCommand
|
|
6
|
+
.command("declare")
|
|
7
|
+
.description("Declare an existing NotebookLM source bundle for a topic-bound notebook")
|
|
8
|
+
.requiredOption("--topic-id <topic-id>", "topic id")
|
|
9
|
+
.requiredOption("--notebook <binding-id>", "notebook binding id")
|
|
10
|
+
.requiredOption("--kind <kind>", "source bundle kind")
|
|
11
|
+
.requiredOption("--title <title>", "manifest display title")
|
|
12
|
+
.option("--description <description>", "manifest description")
|
|
13
|
+
.option("--item-count <count>", "optional bundle item count", parsePositiveInteger)
|
|
14
|
+
.option("--ref <ref>", "reference URL or note", collectValue, [])
|
|
15
|
+
.option("--force", "overwrite an existing manifest with the same id", false)
|
|
16
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
const result = await declareNotebookSourceManifest({
|
|
19
|
+
topicId: options.topicId,
|
|
20
|
+
notebookBindingId: options.notebook,
|
|
21
|
+
kind: options.kind,
|
|
22
|
+
title: options.title,
|
|
23
|
+
...(options.description ? { description: options.description } : {}),
|
|
24
|
+
...(options.itemCount !== undefined ? { itemCount: options.itemCount } : {}),
|
|
25
|
+
...(options.ref.length ? { refs: options.ref } : {}),
|
|
26
|
+
force: options.force
|
|
27
|
+
});
|
|
28
|
+
if (options.json) {
|
|
29
|
+
writeJsonOutput(result);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
writeTextOutput(`Declared notebook source manifest ${result.manifest.id} at ${result.markdownPath}`);
|
|
33
|
+
});
|
|
34
|
+
notebookSourceCommand
|
|
35
|
+
.command("list")
|
|
36
|
+
.description("List notebook-backed source manifests in the current workspace")
|
|
37
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
const manifests = await listNotebookSourceManifests();
|
|
40
|
+
if (options.json) {
|
|
41
|
+
writeJsonOutput({ manifests });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (manifests.length === 0) {
|
|
45
|
+
writeTextOutput("No notebook source manifests found.");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
for (const manifest of manifests) {
|
|
49
|
+
writeTextOutput(`${manifest.id}\t${manifest.topicId}\t${manifest.notebookBindingId}\t${manifest.title}`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
notebookSourceCommand
|
|
53
|
+
.command("show")
|
|
54
|
+
.description("Show one notebook-backed source manifest")
|
|
55
|
+
.argument("<manifest-id>", "manifest id")
|
|
56
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
57
|
+
.action(async (manifestId, options) => {
|
|
58
|
+
const { manifest } = await loadNotebookSourceManifest(manifestId);
|
|
59
|
+
writeJsonOutput({ manifest });
|
|
60
|
+
});
|
|
61
|
+
function parsePositiveInteger(value) {
|
|
62
|
+
const parsed = Number.parseInt(value, 10);
|
|
63
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
64
|
+
throw new Error(`Expected a positive integer, received "${value}".`);
|
|
65
|
+
}
|
|
66
|
+
return parsed;
|
|
67
|
+
}
|
|
68
|
+
function collectValue(value, previous) {
|
|
69
|
+
return [...previous, value.trim()].filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=notebook-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebook-source.js","sourceRoot":"","sources":["../../src/commands/notebook-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createQuestionPlan } from "../core/runs/question-planner.js";
|
|
3
|
+
export declare function resolvePlanInput(topicOrId: string, options: {
|
|
4
|
+
notebook?: string;
|
|
5
|
+
objective?: string;
|
|
6
|
+
maxQuestions?: number;
|
|
7
|
+
families?: string[];
|
|
8
|
+
}): Promise<Parameters<typeof createQuestionPlan>[0]>;
|
|
9
|
+
export declare const planCommand: Command;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createQuestionPlan } from "../core/runs/question-planner.js";
|
|
3
|
+
import { loadTopic } from "../core/topics/manage-topics.js";
|
|
4
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
5
|
+
export async function resolvePlanInput(topicOrId, options) {
|
|
6
|
+
const baseInput = {
|
|
7
|
+
...(options.notebook ? { notebookBindingId: options.notebook } : {}),
|
|
8
|
+
...(options.objective ? { objective: options.objective } : {}),
|
|
9
|
+
...(options.maxQuestions !== undefined ? { maxQuestions: options.maxQuestions } : {}),
|
|
10
|
+
...(options.families?.length ? { families: options.families } : {})
|
|
11
|
+
};
|
|
12
|
+
try {
|
|
13
|
+
await loadTopic(topicOrId);
|
|
14
|
+
return {
|
|
15
|
+
topicId: topicOrId,
|
|
16
|
+
...baseInput
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {
|
|
21
|
+
topic: topicOrId,
|
|
22
|
+
...baseInput
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export const planCommand = new Command("plan")
|
|
27
|
+
.description("Create a deep planned question batch for a topic-backed research run")
|
|
28
|
+
.argument("<topic-or-id>", "topic id for the preferred flow, or a legacy freeform topic string")
|
|
29
|
+
.option("--notebook <binding-id>", "notebook binding id to use for the legacy flow or explicit topic notebook selection")
|
|
30
|
+
.option("--objective <objective>", "objective for the research run")
|
|
31
|
+
.option("--max-questions <count>", "cap the number of planned questions", parsePositiveInteger)
|
|
32
|
+
.option("--families <families>", "comma-separated question families to include", parseCsvList)
|
|
33
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
34
|
+
.action(async (topicOrId, options) => {
|
|
35
|
+
const result = await createQuestionPlan(await resolvePlanInput(topicOrId, options));
|
|
36
|
+
if (options.json) {
|
|
37
|
+
writeJsonOutput(result);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
writeTextOutput(`Planned run ${result.run.id} at ${result.runDir}`);
|
|
41
|
+
});
|
|
42
|
+
function parsePositiveInteger(value) {
|
|
43
|
+
const parsed = Number.parseInt(value, 10);
|
|
44
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
45
|
+
throw new Error(`Expected a positive integer, received "${value}".`);
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
function parseCsvList(value) {
|
|
50
|
+
const items = value
|
|
51
|
+
.split(",")
|
|
52
|
+
.map((item) => item.trim())
|
|
53
|
+
.filter(Boolean);
|
|
54
|
+
if (items.length === 0) {
|
|
55
|
+
throw new Error("Expected at least one comma-separated value.");
|
|
56
|
+
}
|
|
57
|
+
return items;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { executeQARun } from "../core/runs/run-qa.js";
|
|
4
|
+
import { FixtureNotebookRunnerAdapter } from "../core/notebooklm/fixture-adapter.js";
|
|
5
|
+
import { BrowserAgentNotebookRunnerAdapter } from "../core/notebooklm/browser-agent-adapter.js";
|
|
6
|
+
import { loadChromeAttachTarget } from "../core/attach/manage-targets.js";
|
|
7
|
+
import { loadNotebookBinding, loadQuestionBatch } from "../core/runs/load-artifacts.js";
|
|
8
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
9
|
+
export const runCommand = new Command("run")
|
|
10
|
+
.description("Execute a planned NotebookLM Q&A run")
|
|
11
|
+
.argument("<run-id>", "run id to execute")
|
|
12
|
+
.option("--adapter <adapter>", "runner adapter to use", "browser-agent")
|
|
13
|
+
.option("--attach-target <target-id>", "attached Chrome target to use for NotebookLM execution")
|
|
14
|
+
.option("--fixture-file <path>", "fixture response file for local verification")
|
|
15
|
+
.option("--question-id <question-id>", "explicit planned question id to execute", collectCsvValues, [])
|
|
16
|
+
.option("--from-question <question-id>", "start execution from this planned question id")
|
|
17
|
+
.option("--limit <count>", "execute at most this many new questions", parsePositiveInteger)
|
|
18
|
+
.option("--show-browser", "show the browser while the browser-agent adapter runs", false)
|
|
19
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
20
|
+
.action(async (runId, options) => {
|
|
21
|
+
if (options.adapter === "fixture" && !options.fixtureFile) {
|
|
22
|
+
throw new Error("--fixture-file is required when --adapter fixture is used.");
|
|
23
|
+
}
|
|
24
|
+
if (options.questionId.length > 0 && options.fromQuestion) {
|
|
25
|
+
throw new Error("--question-id and --from-question cannot be used together.");
|
|
26
|
+
}
|
|
27
|
+
const adapter = options.adapter === "fixture"
|
|
28
|
+
? await FixtureNotebookRunnerAdapter.fromFile(path.resolve(options.fixtureFile ?? ""))
|
|
29
|
+
: await createAttachedBrowserAdapter(runId, options.attachTarget, options.showBrowser);
|
|
30
|
+
const result = await executeQARun({
|
|
31
|
+
runId,
|
|
32
|
+
adapter,
|
|
33
|
+
...(options.questionId.length ? { questionIds: options.questionId } : {}),
|
|
34
|
+
...(options.fromQuestion ? { fromQuestionId: options.fromQuestion } : {}),
|
|
35
|
+
...(options.limit !== undefined ? { limit: options.limit } : {})
|
|
36
|
+
});
|
|
37
|
+
if (options.json) {
|
|
38
|
+
writeJsonOutput({
|
|
39
|
+
run: result.run,
|
|
40
|
+
completedExchangeIds: result.completedExchanges.map((exchange) => exchange.id),
|
|
41
|
+
completedExchangeCount: result.completedExchanges.length
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
writeTextOutput(`Run ${result.run.id} finished with status ${result.run.status} (${result.completedExchanges.length} exchanges archived)`);
|
|
46
|
+
});
|
|
47
|
+
function parsePositiveInteger(value) {
|
|
48
|
+
const parsed = Number.parseInt(value, 10);
|
|
49
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
50
|
+
throw new Error(`Expected a positive integer, received "${value}".`);
|
|
51
|
+
}
|
|
52
|
+
return parsed;
|
|
53
|
+
}
|
|
54
|
+
function collectCsvValues(value, previous) {
|
|
55
|
+
return [
|
|
56
|
+
...previous,
|
|
57
|
+
...value
|
|
58
|
+
.split(",")
|
|
59
|
+
.map((item) => item.trim())
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
async function createAttachedBrowserAdapter(runId, explicitAttachTargetId, showBrowser) {
|
|
64
|
+
const { run } = await loadQuestionBatch(runId);
|
|
65
|
+
const { binding } = await loadNotebookBinding(run.notebookBindingId);
|
|
66
|
+
const attachTargetId = explicitAttachTargetId ?? binding.attachTargetId;
|
|
67
|
+
if (!attachTargetId) {
|
|
68
|
+
throw new Error(`Run ${runId} does not have an attached Chrome target. Re-run with --attach-target <target-id> or bind the notebook with --attach-target.`);
|
|
69
|
+
}
|
|
70
|
+
const { target } = await loadChromeAttachTarget(attachTargetId);
|
|
71
|
+
return new BrowserAgentNotebookRunnerAdapter({
|
|
72
|
+
attachTarget: target,
|
|
73
|
+
showBrowser
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { formatWorkspaceStatusReport, buildWorkspaceStatusReport } from "../core/operator/workspace-operator.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const statusCommand = new Command("status")
|
|
5
|
+
.description("Show a workspace-level SourceLoop status overview")
|
|
6
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
7
|
+
.action(async (options) => {
|
|
8
|
+
const report = await buildWorkspaceStatusReport();
|
|
9
|
+
if (options.json) {
|
|
10
|
+
writeJsonOutput(report);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
writeTextOutput(formatWorkspaceStatusReport(report));
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;IAC3C,MAAM,MAAM,GAAG,MAAM,0BAA0B,EAAE,CAAC;IAElD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { createTopic, listTopics, loadTopic } from "../core/topics/manage-topics.js";
|
|
3
|
+
import { writeJsonOutput, writeTextOutput } from "../lib/cli-output.js";
|
|
4
|
+
export const topicCommand = new Command("topic").description("Create and inspect topic-first research roots");
|
|
5
|
+
topicCommand
|
|
6
|
+
.command("create")
|
|
7
|
+
.description("Create a research topic root")
|
|
8
|
+
.requiredOption("--name <name>", "topic display name")
|
|
9
|
+
.option("--goal <goal>", "optional research goal for this topic")
|
|
10
|
+
.option("--output <output>", "optional output hint, for example lecture, brief, or playbook")
|
|
11
|
+
.option("--force", "overwrite an existing topic with the same id", false)
|
|
12
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
const result = await createTopic({
|
|
15
|
+
name: options.name,
|
|
16
|
+
...(options.goal ? { goal: options.goal } : {}),
|
|
17
|
+
...(options.output ? { intendedOutput: options.output } : {}),
|
|
18
|
+
force: options.force
|
|
19
|
+
});
|
|
20
|
+
if (options.json) {
|
|
21
|
+
writeJsonOutput(result);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
writeTextOutput(`Created topic ${result.topic.id} at ${result.topicDir}`);
|
|
25
|
+
});
|
|
26
|
+
topicCommand
|
|
27
|
+
.command("list")
|
|
28
|
+
.description("List research topics in the current workspace")
|
|
29
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
const topics = await listTopics();
|
|
32
|
+
if (options.json) {
|
|
33
|
+
writeJsonOutput({ topics });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (topics.length === 0) {
|
|
37
|
+
writeTextOutput("No research topics found.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
for (const topic of topics) {
|
|
41
|
+
writeTextOutput(`${topic.id}\t${topic.status}\t${topic.name}`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
topicCommand
|
|
45
|
+
.command("show")
|
|
46
|
+
.description("Show one research topic and its corpus metadata")
|
|
47
|
+
.argument("<topic-id>", "topic id")
|
|
48
|
+
.option("--json", "emit machine-readable JSON", false)
|
|
49
|
+
.action(async (topicId, options) => {
|
|
50
|
+
const { topic, corpus } = await loadTopic(topicId);
|
|
51
|
+
writeJsonOutput({ topic, corpus });
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=topic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"topic.js","sourceRoot":"","sources":["../../src/commands/topic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,+CAA+C,CAAC,CAAC;AAE9G,YAAY;KACT,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,cAAc,CAAC,eAAe,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,MAAM,CAAC,mBAAmB,EAAE,+DAA+D,CAAC;KAC5F,MAAM,CAAC,SAAS,EAAE,8CAA8C,EAAE,KAAK,CAAC;KACxE,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAwF,EAAE,EAAE;IACzG,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,eAAe,CAAC,iBAAiB,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEL,YAAY;KACT,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;IAC3C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,eAAe,CAAC,2BAA2B,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,eAAe,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,YAAY;KACT,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;KAClC,MAAM,CAAC,QAAQ,EAAE,4BAA4B,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA0B,EAAE,EAAE;IAC5D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACnD,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC"}
|