@scribed/cli 0.1.23 → 0.1.24

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/index.js CHANGED
@@ -50896,7 +50896,7 @@ var program = new Command;
50896
50896
  // package.json
50897
50897
  var package_default = {
50898
50898
  name: "@scribed/cli",
50899
- version: "0.1.23",
50899
+ version: "0.1.24",
50900
50900
  description: "Command-line client + MCP server for Scribed — CRM records, phone + texting, inbox, calendar + booking, transcriptions, HR, Vault, automations, Creative Studio, and Documents, derived from the scribed-agent tool catalog.",
50901
50901
  type: "module",
50902
50902
  license: "SEE LICENSE IN LICENSE",
@@ -76084,7 +76084,7 @@ class StreamableHTTPClientTransport {
76084
76084
  // package.json
76085
76085
  var package_default2 = {
76086
76086
  name: "@scribed/cli",
76087
- version: "0.1.23",
76087
+ version: "0.1.24",
76088
76088
  description: "Command-line client + MCP server for Scribed — CRM records, phone + texting, inbox, calendar + booking, transcriptions, HR, Vault, automations, Creative Studio, and Documents, derived from the scribed-agent tool catalog.",
76089
76089
  type: "module",
76090
76090
  license: "SEE LICENSE IN LICENSE",
@@ -83890,8 +83890,9 @@ async function fetchObjectType(client, workspaceId10, collectionId) {
83890
83890
  throw new Error("Scribed API returned no collection.");
83891
83891
  return res.collection;
83892
83892
  }
83893
- async function fetchObjectRecord(client, workspaceId10, recordId) {
83894
- const res = await client.get(`${collectionApi(workspaceId10)}/records/${encodeURIComponent(recordId)}`);
83893
+ async function fetchObjectRecord(client, workspaceId10, recordId, sourceCollectionId) {
83894
+ const selector = sourceCollectionId ? `?collectionId=${encodeURIComponent(sourceCollectionId)}` : "";
83895
+ const res = await client.get(`${collectionApi(workspaceId10)}/records/${encodeURIComponent(recordId)}${selector}`);
83895
83896
  if (!res?.record)
83896
83897
  throw new Error(`No record with id '${recordId}' — get record ids from objects_records_list.`);
83897
83898
  return res.record;
@@ -83946,7 +83947,9 @@ function objectTypeSummary(type) {
83946
83947
  description: type.description ?? "",
83947
83948
  titleFieldKey: keyFor(type.titleFieldId),
83948
83949
  pipelineFieldKey: keyFor(type.pipelineFieldId),
83949
- recordCount: typeof type.recordCount === "number" ? type.recordCount : 0,
83950
+ recordCount: type.recordCountAvailable === false ? null : typeof type.recordCount === "number" ? type.recordCount : 0,
83951
+ ...type.recordCountAvailable === undefined ? {} : { recordCountAvailable: type.recordCountAvailable },
83952
+ ...type.sourceStatus ? { sourceStatus: type.sourceStatus } : {},
83950
83953
  fields: type.fields.map((f) => {
83951
83954
  const outcomes = (f.options ?? []).filter((o) => stageOutcomeOf(o) !== null);
83952
83955
  return {
@@ -84149,7 +84152,7 @@ var objectsSourcesList = collectionRestTool({
84149
84152
  });
84150
84153
  var objectsSourceAdd = collectionRestTool({
84151
84154
  description: "Add an existing service as a collection for the selected account or workspace owner. Discover supported sources with objects_sources_list. Reuses installed metadata and saved views without copying records. Requires an editor or manager. Generic record and field writes are protected; open row.source.href for original service actions. Credential metadata requires vault access and never includes secrets. Financials combines authorized payroll entries and native imported transactions, statements and reconciliations without duplicating pay-run totals. Use financials_entries_list/import and financials_entry_review for imported data; generic record writes remain protected. Prefer Financials over the legacy pay_runs/pay_items sources. Capital reads live SAFE activity and standalone investment positions linked to canonical Contacts, Deals and Raises; adding it creates no agreement or payment. Use a returned saved viewId with workspace_page_create(kind=collection) for a Capital page, or bind it to a view block on any doc page. Check existing pages/views first. Account scope supports only sources returned by account-scoped discovery; workspace-only services remain unavailable there. Account-owned data remains personal and Notes retain their separate session-only access.",
84152
- inputSchema: exports_external.object({ workspaceId: WorkspaceIdArg, scope: AccountResourceScopeArg, source: exports_external.enum(["transcriptions", "events", "members", "ideas", "comments", "bulletins", "credentials", "activity", "forms", "financials", "capital", "pay_runs", "pay_items", "notes", "vault"]) }).refine(({ scope, source }) => scope === "account" ? ["transcriptions", "notes", "vault", "activity"].includes(source) : source !== "notes" && source !== "vault", { path: ["source"], message: "Choose a source available to the selected account or workspace owner." }),
84155
+ inputSchema: exports_external.object({ workspaceId: WorkspaceIdArg, scope: AccountResourceScopeArg, source: exports_external.enum(["transcriptions", "events", "members", "ideas", "comments", "bulletins", "credentials", "activity", "forms", "financials", "capital", "pay_runs", "pay_items", "notes", "vault", "phone_calls", "phone_messages", "phone_call_campaigns", "phone_call_entries", "phone_sms_campaigns", "phone_sms_recipients", "time_entries", "timecards", "time_off", "time_off_balances", "compensation", "form_responses", "data_rooms", "data_room_files", "metric_targets"]) }).refine(({ scope, source }) => scope === "account" ? ["transcriptions", "notes", "vault", "activity"].includes(source) : source !== "notes" && source !== "vault", { path: ["source"], message: "Choose a source available to the selected account or workspace owner." }),
84153
84156
  method: "POST",
84154
84157
  path: (a, ws) => `${collectionApi(ws)}/collections/sources/${encodeURIComponent(a.source)}`,
84155
84158
  body: () => ({})
@@ -84202,7 +84205,7 @@ var objectsRecordTitles = collectionRestTool({
84202
84205
  path: (a, ws) => `${collectionApi(ws)}/records/titles${query2({ ids: a.recordIds.join(",") })}`
84203
84206
  });
84204
84207
  var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(defineTool({
84205
- description: "Read ONE record — its full field values (valuesByKey by unique field KEY, plus legacy values by field label; option ids resolved to labels in both; optionIdsByKey retains stored option IDs for distinguishing same-label choices) plus its notes timeline (oldest first). Pass the recordId from objects_records_list; the collection selector is optional (the record knows its collection). Use this before answering detailed questions about a specific contact, company, deal, or task, or quoting its contents — never answer from the list row alone. Returns { collection, record: { id, collectionId, title, iconUrl?, values, valuesByKey, optionIdsByKey?, createdAt, updatedAt }, notes: [{ id, text, pinned, source, createdAt, updatedAt }] } — a formula field's value is the stored computed number (absent when its inputs were empty), never something to edit. 404 record_not_found = no active record with that id in this workspace. For a Financials service row this tool reads the authorized source projection, including Payroll virtual entries, without generic notes (notesSupported:false). Use financials_entry_get/events for native imported entry evidence and version history; Payroll IDs are not imported entry IDs. For a service-managed transcription row this tool reads the exact canonical transcription and returns { collection, source, transcription, transcriptPage } instead of generic record notes. Pass its collection typeId/key when known. Continue long content with transcription_get using source.id, source.workspaceId for workspace sources, transcriptPage.nextOffset and transcriptPage.version as expectedVersion; never summarize from its title alone." + (personalTranscriptions ? " Use scope account for Personal transcription sources." : " Personal transcription source content requires the signed-in interactive Scribed agent; ordinary account records remain readable here."),
84208
+ description: "Read ONE record — its full field values (valuesByKey by unique field KEY, plus legacy values by field label; option ids resolved to labels in both; optionIdsByKey retains stored option IDs for distinguishing same-label choices) plus its notes timeline (oldest first). Pass the recordId from objects_records_list. Include its typeId or key for managed service rows, especially phone and HR; the selector is optional for ordinary records. Use this before answering detailed questions about a specific contact, company, deal, or task, or quoting its contents — never answer from the list row alone. Returns { collection, record: { id, collectionId, title, iconUrl?, values, valuesByKey, optionIdsByKey?, createdAt, updatedAt }, notes: [{ id, text, pinned, source, createdAt, updatedAt }] } — a formula field's value is the stored computed number (absent when its inputs were empty), never something to edit. 404 record_not_found = no active record with that id in this workspace. Managed service rows read the authorized collection projection without generic CRM notes (notesSupported:false); source.href opens the original service. Financials includes Payroll virtual entries. Use financials_entry_get/events for native imported entry evidence and version history; Payroll IDs are not imported entry IDs. For a service-managed transcription row this tool reads the exact canonical transcription and returns { collection, source, transcription, transcriptPage } instead of generic record notes. Pass its collection typeId/key when known. Continue long content with transcription_get using source.id, source.workspaceId for workspace sources, transcriptPage.nextOffset and transcriptPage.version as expectedVersion; never summarize from its title alone." + (personalTranscriptions ? " Use scope account for Personal transcription sources." : " Personal transcription source content requires the signed-in interactive Scribed agent; ordinary account records remain readable here."),
84206
84209
  inputSchema: exports_external.object({
84207
84210
  ...AccountCollectionSelector,
84208
84211
  recordId: exports_external.string().min(1).max(100)
@@ -84240,7 +84243,7 @@ var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(d
84240
84243
  return await readTranscription(selected2);
84241
84244
  let record3;
84242
84245
  try {
84243
- record3 = await fetchObjectRecord(client, workspaceId10, a.recordId);
84246
+ record3 = await fetchObjectRecord(client, workspaceId10, a.recordId, selected2?.id);
84244
84247
  } catch (error51) {
84245
84248
  const source = !selected2 && types.find((type2) => type2.source === "transcriptions");
84246
84249
  if (source && error51 instanceof AppWorkerError && error51.status === 404 && error51.details?.code === "record_not_found") {
@@ -84249,7 +84252,7 @@ var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(d
84249
84252
  throw error51;
84250
84253
  }
84251
84254
  const type = types.find((t) => t.id === record3.collectionId);
84252
- if (type?.source === "financials" && record3.source?.kind === "financial_entry") {
84255
+ if (type?.source && record3.source) {
84253
84256
  return { collection: collectionRef(type), record: presentObjectRecord(type, record3), notes: [], notesSupported: false };
84254
84257
  }
84255
84258
  const notesRes = await client.get(`${base14}/records/${encodeURIComponent(a.recordId)}/notes`);
@@ -70177,7 +70177,7 @@ class StdioServerTransport {
70177
70177
  // package.json
70178
70178
  var package_default = {
70179
70179
  name: "@scribed/cli",
70180
- version: "0.1.23",
70180
+ version: "0.1.24",
70181
70181
  description: "Command-line client + MCP server for Scribed — CRM records, phone + texting, inbox, calendar + booking, transcriptions, HR, Vault, automations, Creative Studio, and Documents, derived from the scribed-agent tool catalog.",
70182
70182
  type: "module",
70183
70183
  license: "SEE LICENSE IN LICENSE",
@@ -81776,8 +81776,9 @@ async function fetchObjectType(client, workspaceId10, collectionId) {
81776
81776
  throw new Error("Scribed API returned no collection.");
81777
81777
  return res.collection;
81778
81778
  }
81779
- async function fetchObjectRecord(client, workspaceId10, recordId) {
81780
- const res = await client.get(`${collectionApi(workspaceId10)}/records/${encodeURIComponent(recordId)}`);
81779
+ async function fetchObjectRecord(client, workspaceId10, recordId, sourceCollectionId) {
81780
+ const selector = sourceCollectionId ? `?collectionId=${encodeURIComponent(sourceCollectionId)}` : "";
81781
+ const res = await client.get(`${collectionApi(workspaceId10)}/records/${encodeURIComponent(recordId)}${selector}`);
81781
81782
  if (!res?.record)
81782
81783
  throw new Error(`No record with id '${recordId}' — get record ids from objects_records_list.`);
81783
81784
  return res.record;
@@ -81832,7 +81833,9 @@ function objectTypeSummary(type) {
81832
81833
  description: type.description ?? "",
81833
81834
  titleFieldKey: keyFor(type.titleFieldId),
81834
81835
  pipelineFieldKey: keyFor(type.pipelineFieldId),
81835
- recordCount: typeof type.recordCount === "number" ? type.recordCount : 0,
81836
+ recordCount: type.recordCountAvailable === false ? null : typeof type.recordCount === "number" ? type.recordCount : 0,
81837
+ ...type.recordCountAvailable === undefined ? {} : { recordCountAvailable: type.recordCountAvailable },
81838
+ ...type.sourceStatus ? { sourceStatus: type.sourceStatus } : {},
81836
81839
  fields: type.fields.map((f) => {
81837
81840
  const outcomes = (f.options ?? []).filter((o) => stageOutcomeOf(o) !== null);
81838
81841
  return {
@@ -82035,7 +82038,7 @@ var objectsSourcesList = collectionRestTool({
82035
82038
  });
82036
82039
  var objectsSourceAdd = collectionRestTool({
82037
82040
  description: "Add an existing service as a collection for the selected account or workspace owner. Discover supported sources with objects_sources_list. Reuses installed metadata and saved views without copying records. Requires an editor or manager. Generic record and field writes are protected; open row.source.href for original service actions. Credential metadata requires vault access and never includes secrets. Financials combines authorized payroll entries and native imported transactions, statements and reconciliations without duplicating pay-run totals. Use financials_entries_list/import and financials_entry_review for imported data; generic record writes remain protected. Prefer Financials over the legacy pay_runs/pay_items sources. Capital reads live SAFE activity and standalone investment positions linked to canonical Contacts, Deals and Raises; adding it creates no agreement or payment. Use a returned saved viewId with workspace_page_create(kind=collection) for a Capital page, or bind it to a view block on any doc page. Check existing pages/views first. Account scope supports only sources returned by account-scoped discovery; workspace-only services remain unavailable there. Account-owned data remains personal and Notes retain their separate session-only access.",
82038
- inputSchema: exports_external.object({ workspaceId: WorkspaceIdArg, scope: AccountResourceScopeArg, source: exports_external.enum(["transcriptions", "events", "members", "ideas", "comments", "bulletins", "credentials", "activity", "forms", "financials", "capital", "pay_runs", "pay_items", "notes", "vault"]) }).refine(({ scope, source }) => scope === "account" ? ["transcriptions", "notes", "vault", "activity"].includes(source) : source !== "notes" && source !== "vault", { path: ["source"], message: "Choose a source available to the selected account or workspace owner." }),
82041
+ inputSchema: exports_external.object({ workspaceId: WorkspaceIdArg, scope: AccountResourceScopeArg, source: exports_external.enum(["transcriptions", "events", "members", "ideas", "comments", "bulletins", "credentials", "activity", "forms", "financials", "capital", "pay_runs", "pay_items", "notes", "vault", "phone_calls", "phone_messages", "phone_call_campaigns", "phone_call_entries", "phone_sms_campaigns", "phone_sms_recipients", "time_entries", "timecards", "time_off", "time_off_balances", "compensation", "form_responses", "data_rooms", "data_room_files", "metric_targets"]) }).refine(({ scope, source }) => scope === "account" ? ["transcriptions", "notes", "vault", "activity"].includes(source) : source !== "notes" && source !== "vault", { path: ["source"], message: "Choose a source available to the selected account or workspace owner." }),
82039
82042
  method: "POST",
82040
82043
  path: (a, ws) => `${collectionApi(ws)}/collections/sources/${encodeURIComponent(a.source)}`,
82041
82044
  body: () => ({})
@@ -82088,7 +82091,7 @@ var objectsRecordTitles = collectionRestTool({
82088
82091
  path: (a, ws) => `${collectionApi(ws)}/records/titles${query2({ ids: a.recordIds.join(",") })}`
82089
82092
  });
82090
82093
  var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(defineTool({
82091
- description: "Read ONE record — its full field values (valuesByKey by unique field KEY, plus legacy values by field label; option ids resolved to labels in both; optionIdsByKey retains stored option IDs for distinguishing same-label choices) plus its notes timeline (oldest first). Pass the recordId from objects_records_list; the collection selector is optional (the record knows its collection). Use this before answering detailed questions about a specific contact, company, deal, or task, or quoting its contents — never answer from the list row alone. Returns { collection, record: { id, collectionId, title, iconUrl?, values, valuesByKey, optionIdsByKey?, createdAt, updatedAt }, notes: [{ id, text, pinned, source, createdAt, updatedAt }] } — a formula field's value is the stored computed number (absent when its inputs were empty), never something to edit. 404 record_not_found = no active record with that id in this workspace. For a Financials service row this tool reads the authorized source projection, including Payroll virtual entries, without generic notes (notesSupported:false). Use financials_entry_get/events for native imported entry evidence and version history; Payroll IDs are not imported entry IDs. For a service-managed transcription row this tool reads the exact canonical transcription and returns { collection, source, transcription, transcriptPage } instead of generic record notes. Pass its collection typeId/key when known. Continue long content with transcription_get using source.id, source.workspaceId for workspace sources, transcriptPage.nextOffset and transcriptPage.version as expectedVersion; never summarize from its title alone." + (personalTranscriptions ? " Use scope account for Personal transcription sources." : " Personal transcription source content requires the signed-in interactive Scribed agent; ordinary account records remain readable here."),
82094
+ description: "Read ONE record — its full field values (valuesByKey by unique field KEY, plus legacy values by field label; option ids resolved to labels in both; optionIdsByKey retains stored option IDs for distinguishing same-label choices) plus its notes timeline (oldest first). Pass the recordId from objects_records_list. Include its typeId or key for managed service rows, especially phone and HR; the selector is optional for ordinary records. Use this before answering detailed questions about a specific contact, company, deal, or task, or quoting its contents — never answer from the list row alone. Returns { collection, record: { id, collectionId, title, iconUrl?, values, valuesByKey, optionIdsByKey?, createdAt, updatedAt }, notes: [{ id, text, pinned, source, createdAt, updatedAt }] } — a formula field's value is the stored computed number (absent when its inputs were empty), never something to edit. 404 record_not_found = no active record with that id in this workspace. Managed service rows read the authorized collection projection without generic CRM notes (notesSupported:false); source.href opens the original service. Financials includes Payroll virtual entries. Use financials_entry_get/events for native imported entry evidence and version history; Payroll IDs are not imported entry IDs. For a service-managed transcription row this tool reads the exact canonical transcription and returns { collection, source, transcription, transcriptPage } instead of generic record notes. Pass its collection typeId/key when known. Continue long content with transcription_get using source.id, source.workspaceId for workspace sources, transcriptPage.nextOffset and transcriptPage.version as expectedVersion; never summarize from its title alone." + (personalTranscriptions ? " Use scope account for Personal transcription sources." : " Personal transcription source content requires the signed-in interactive Scribed agent; ordinary account records remain readable here."),
82092
82095
  inputSchema: exports_external.object({
82093
82096
  ...AccountCollectionSelector,
82094
82097
  recordId: exports_external.string().min(1).max(100)
@@ -82126,7 +82129,7 @@ var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(d
82126
82129
  return await readTranscription(selected2);
82127
82130
  let record3;
82128
82131
  try {
82129
- record3 = await fetchObjectRecord(client, workspaceId10, a.recordId);
82132
+ record3 = await fetchObjectRecord(client, workspaceId10, a.recordId, selected2?.id);
82130
82133
  } catch (error51) {
82131
82134
  const source = !selected2 && types.find((type2) => type2.source === "transcriptions");
82132
82135
  if (source && error51 instanceof AppWorkerError && error51.status === 404 && error51.details?.code === "record_not_found") {
@@ -82135,7 +82138,7 @@ var buildObjectsRecordRead = (personalTranscriptions = false) => Object.assign(d
82135
82138
  throw error51;
82136
82139
  }
82137
82140
  const type = types.find((t) => t.id === record3.collectionId);
82138
- if (type?.source === "financials" && record3.source?.kind === "financial_entry") {
82141
+ if (type?.source && record3.source) {
82139
82142
  return { collection: collectionRef(type), record: presentObjectRecord(type, record3), notes: [], notesSupported: false };
82140
82143
  }
82141
82144
  const notesRes = await client.get(`${base14}/records/${encodeURIComponent(a.recordId)}/notes`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scribed/cli",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
4
4
  "description": "Command-line client + MCP server for Scribed — CRM records, phone + texting, inbox, calendar + booking, transcriptions, HR, Vault, automations, Creative Studio, and Documents, derived from the scribed-agent tool catalog.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -39,9 +39,9 @@
39
39
  "url": "git+https://github.com/q6th/scribed-web.git",
40
40
  "directory": "scribed-cli"
41
41
  },
42
- "gitHead": "7a66bfcfbfa6a4d6ab8f94fea9ad897f828cc2dd",
42
+ "gitHead": "409663d349eaacf5bd08e72e93c94464540021bb",
43
43
  "scribedRelease": {
44
44
  "repository": "q6th/scribed-web",
45
- "commit": "7a66bfcfbfa6a4d6ab8f94fea9ad897f828cc2dd"
45
+ "commit": "409663d349eaacf5bd08e72e93c94464540021bb"
46
46
  }
47
47
  }